전체 글

엉엉
ETC

Tistory Code Tab Size

Code Tab이 너무 좁아서 보기가 좀 안 예뻤다.CSS 편집에서 아래를 붙여넣어주도록 하자. code { font-size: 16px; line-height: 24px; font-family: consolas; tab-size: 4; }

UE/BN Project

Spawn Squad Interface

Why?나는 Perception자극을 Squad단위로 전파하길 원한다.이는 Team단위에서 더 쪼개진 단위로, 각 Actor 무리들은 Squad ID를 가진다.이때, 이 Squad를 Spawn하는 단계에서 문제점이 발생했다.NewActor->SpawnCollisionHandlingMethod = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;이런 방식으로 Spawn을 할 때, Z값에 대해서도 Adjust가 적용되어, Actor위에 Actor가 올라타있는 경우가 생기고, 만약 Step On을 허용하지 않는다면, Spawn단계에서 팅겨져 나가는 경우가 발생한다.따라서 나는 지정된 위치에서 XY방향으로 고르게 퍼져나가며 Spawn하..

PS/문제

BOJ G3. 오등큰수

https://www.acmicpc.net/problem/17299 문제의 특성상 수열을 각 수열의 숫자가 등장한 횟수로 치환한 수열로 나타냈을 때, 내림차순의 형태를 띌 것이다.이때, 오름차순으로 바뀌는 지점의 값 K가 있다면, 이전 숫자들 중 K보다 작은 숫자의 오등큰수는, 등장 횟수를 치환한 수열을 다시 F(x)라고 한다면 F(K)가 될 것이다.이를 이용하여 Stack으로 문제를 해결할 수 있다. #include #define fastio std::ios_base::sync_with_stdio(false);\cin.tie(NULL)using namespace std;using ll = long long;using pii = pair;using tiii = tuple;int dx[4] = { -1,1..

PS/문제

BOJ. G2 모래성

https://www.acmicpc.net/problem/10711 Brute하게는 100만개의 8방을 매번 검사하여 찾을 수 있다.하지만 모래성이 하나하나 꺼지는 경우를 생각하면, 시간복잡도에서 뻑이 날 것이다.따라서, 이를 줄이는 부분이 필요하고, 모래성이 꺼질 때만 그 주변의 모래성을 검사하면 된다는 아이디어로 최적화를 할 수 있었다. BFS와 Level Queue 테크닉을 사용하여 문제를 해결했다. #include #define fastio std::ios_base::sync_with_stdio(false);\cin.tie(NULL)using namespace std;using ll = long long;using pii = pair;using tiii = tuple;int dx[3] = { 0,..

UE/Basic

Behavior Tree

When?인공지능의 행동 양식을 구현할 때 사용한다.  Why?간단한 행동양식인 경우에는 각 FSM과 같이 State를 이동하며, 행동양식을 만들 수 있다.하지만 복잡한 행동양식인 경우에 State가 많아질수록 기하급수적으로 복잡해진다는 단점이 있다.이를 해결하기 위해, Tree형태로 행동양식을 결정하는 Behavior Tree가 등장했고, 유지보수에 강한 장점이 있다.  How?AIController 내부에는 BrainComponent와 BlackBoardComponent가 준비되어 있다.BrainComponent는 BehaviorTree의 부모로, RunBehaviroTree() 에서 BTComp와 BBComp가 NewObject를 통해 만들어진다.두 Component의 내부에는 당연히도 BT와 BB..

PS/문제

BOJ. G3 종이조각

https://www.acmicpc.net/problem/14391 시간복잡도는 Brute하게 0,0을 시작 지점으로 잡으면 처음 만들 수 있는 종이조각 갯수 7, 다음 0,1 은 6, 다음 5 .....이런식으로 16개 자리에 대해 계산해보면 1,741,824,000 이 나온다.이 값이 Brute하기도 하고, 문제 제한 시간이 2초이므로, 20억 이내로 Safe이다. 풀이의 DFS는 X++ 방향으로 나아가며, X가 가로 범위를 넘어설 때, Y를 증가시킨다.이때 DFS의 반환값은 현재 Board의 위치에서 X++, Y++ 방향으로 신장하여 만들 수 있는 모든 종이조각에 대하여, 그 이후에 만들 수 있는 다른 모든 종이조각의 합 중 최댓값이다.이를 구현하기 위해, BackTracking을 사용했다.#inc..

UE/Basic

NavMesh

When?인공지능을 통해 Actor가 목표 지점으로 길찾기를 할 때 쓰인다.  Why?Actor가 목표 지점으로의 길을 찾아야 할 때, 어떤 길, 어떤 경사로 등 다양한 조건들을 체크할 수 있어야 한다.Actor의 높이나, 넓이에 따라 선택적으로 길을 찾을 수 있어야 하며, 지형 정보에 따라 선호하는 길을 찾을 수 도 있어야 한다.이런 것을 NavMesh를 통해 구현할 수 있으며, 이는 Detour & Recast Library를 Unreal에 통합하여 Engine에서 지원하는 것으로 보인다.  How?1. NavMesh Bounds Volume먼저 어떤 길에 NavMesh를 생성하려면 어디서부터 어디까지 생성할지 범위에 대한 지정이 필요하다.그것을 NavMesh Bounds Volume을 통해 지정할 ..

UE/Shooter Project

My GAS

Why?나는 항상 좋은 구조에 대한 의구심을 품어왔다.내가 이전에 진행하다 갈아엎은 프로젝트들은 Component사이의 종속성이 생기고, Character가 할 수 있는 행동들은 많은 클래스들에 퍼져있었다.이렇게 되면 컴포넌트들을 재사용할 수 없는 것은 물론, 갈수록 가독성이 떨어지고 복잡성이 증가해 유지보수가 힘들어진다.이런 상황속에서 나는 Component들이 API만을 제공할 때, 그 API를 조합하여 행동을 정의할 수 있는 Ability를 떠올렸다.이전에 GAS를 공부하며, 사용해 봤을 때, Ability 하나를 정의하기 위해 수 많은 코드를 작성해야 하는 어려움과, 워낙에 방대한 프레임워크이기 때문에 내가 제대로 알고 있음을 알 수 없는 어려움이 있었기에 나는 이를 경량화하여, 내가 완전히 이해..

코어른(진)
코맹이