적, 타격, 피격을 구현해보려고 한다.
1 우선 Enemy를 표현할 Character 액터를 CPP로 추가하고,
BP로 상속받아 생성한다.
BP를 통해 시각적으로 보며,
SkeletalMesh를 회전하고 높이를 맞춰놓을 수 있기 때문이다.
2 해당 Character를 움직일 AIController를 CPP로 추가하고,
BP로 상속받아 생성한다.
Controller를 굳이 BP로도 설정하는 이유는,
다음 단계에서 볼 수 있다.
간단하게 변수의 값을 시각적으로 설정가능.
혹시 모를 BP노드의 사용 + 일관성 을 위해서도 있다.
3 BT와 BB를 생성하여 서로 연결하고,
BT를 AIController와 연결한다.
AIController CPP클래스에 위처럼 설정하고 BP에서 BT를 매핑
이로써 AIController와 BT, BB를 연결했다.
1 BT에서 사용할 BB변수값들을 AIController에서 설정한다.
NavMesh 설정을 진행했다. (P로 확인)
2 BT Task노드나 BT Service노드를 생성한다.
지금은 Service Node만 우선 만들어본다.
플레이어가 감지되면, 플레이어의 위치로 따라가도록 하기 위해서.
간단하게 이런식으로 작성을 해보았다.
플레이어를 확인하면 SetFocus로 플레이어를 쳐다보며 따라오게 될 것이다.
반대로 감지되지 않는다면, ClearFocus로 원래 자리를 쳐다보며 돌아가게 된다.
하지만, ServiceNode의 TickNode에 들어가서
interval이 0.2마다 실행되어 일반 Tick에 비해 상당히 부자연스럽다.
그래서 0.01인 clamp 최소값으로 지정해보았는데,
왜인지 적의 속도가 10배정도 느려지게 된다.
문제를 해결하고 BT를 간단히 위처럼 구성해 보았다.
123 구역으로 나눠서 볼 때,
1은 Detect에 의해
PlayerLocation과 ChasedTarget가 감지된다면, 실행되는 부분
PlayerLocation으로 이동하고, Service노드에 의해 ChasedTarget을 보며 이동.
(사실 Service노드가 없어도 Location을 따라갈 때, 보게 되어있다)
(그리고 ChasedTarget을 BB에서 Actor로 바꿔야만 노드에 적용할 수 있다)
2는 플레이어를 놓친 경우로,
마지막으로 감지된 LastPlayerLocation으로 한 번 더 이동해 본다.
이동하고, LastPlayerLocation을 초기화한다.
3은 플레이어를 완전히 놓친 경우로,
원래 위치로 이동 및 원래 방향으로 회전한다.
Enemy BP에서 구현하고 싶은 기능은 회전과 더불어
여기서 가장 까다로운 부분은,
탐색을 멈추고 돌아가는 경우일 것이다.
언제 걷기를 실행하고, 언제 Idle을 실행할지
그 값을 어떤 변수로 설정하는 것이 자연스러울지 생각해본다.
위의 노드가 핵심이다. 위의 노드로 봐야하는 Rotator를 구하고,
해당 값의 z만을 Pawn의 Rotator에 적용하였다.
https://forums.unrealengine.com/t/strange-ai-movement/2725
즉 플레이어가 있는지 한 번 더 확인하는 목적의 코드이다