[UE5] Smart Enemy AI - Part 1 :: Behavior Trees (2)

chooha·2025년 4월 4일

UE5

목록 보기
2/3

이 전 포스팅에서 비헤이비어 트리를 이용해 플레이어를 따라가는 AI를 만들었음
이것을 확장하여 플레이어를 따라간 뒤 공격하는 AI를 만들려고 함

◼️ 플레이어를 따라가서 공격하기

저번 시간에 블루프린트 커스텀 이벤트로 공격 모션을 플레이하는 로직을 만들었었는데, 비헤이비어 트리에는 따로 공격 노드가 없음
그래서 커스텀 이벤트를 만들어 준 것 처럼 Task라는 것을 만들어줘야 함

Task를 생성하면 기본 블루프린트 이벤트 그래프와 비슷하게 화면이 나옴
여기에 로직을 작성하면 해당 태스크를 실행할 때 그 로직이 동작되는 방식임

이때, 꼭 필요한 노드 두개가 있음

  • Event Receive Execute AI : 비헤이비어 트리 안에서 이 태스크가 활성화될 때 트리거 됨
  • Finish Execute : 태스크가 정상적으로 종료 되었음을 알려주는 노드, 이 노드를 마지막에 넣어줘야 Task가 종료될 수 있음

일단 BP_EnemyBase에서 공격 모션이 정상적으로 플레이되어 끝났을 때 이벤트를 콜해줘야함 (일단 Interrupted 했을 때도 넣어놓음)

다시 Task 정의로 돌아와서 두 노드 사이에 블루프린트에서 만든 커스텀 이벤트 Attack을 실행하고, 정상적으로 플레이 됐다면 이벤트를 콜해서 FinishedAttacking 이벤트를 통해 태스크가 종료됨
→ 이렇게 종료 이벤트를 설정하지 않고, Attack함수 다음에 바로 Finish Execute 노드를 배치하게 되면 모션이 끝나기도 전에 태스크가 종료되어 반복하여, 실제로는 공격하는 모션이 보이지 않음

이렇게 잘 동작하는 것을 확인할 수 있음
근데 여기서 문제가 있음

위와 같이 플레이어를 바라보는 방향이 아니어도 동작이 인식되는 것

◼️ 플레이어에게 포커스 설정

이를 해결하기 위해 새로운 태스크 FocusTarget을 생성

Owner Controller를 끌어서 SetFocus노드를 생성해줌

  • SetFocus : Target AI의 포커스를 New Focus의 오브젝트로 설정해줌

AttackTargetKey라는 Blackboad key selector 타입의 변수를 Public으로 만들어주고, Actor형태로 반환해 설정해줌

비헤이비어 트리에서 이동 다음 태스크로 FocusTarget을 배치해주고, AttackTargetKey를 블랙보드에 지정해놓은 AttackTarget으로 설정해줌

그리고 BP_EnemyBase의 캐릭터 무브먼트 디테일 창에서 Use Controller Desired Rotation을 체크해줌

플레이어에게 계속 포커스가 맞춰짐
그런데 여기서 또 문제가 생김

위의 영상을 보면 플레이어 집착광공마냥 시선을 떼지않고 경사로를 내려오는 모습이 보임
이 부분은 간단히 해결할 수 있음

◼️ 포커스 이슈 해결

ClearFocus라는 새로운 태스크를 생성함

ClearFocus노드를 통해 Controller의 Focus를 리셋해줌

그리고 비헤이비어트리로 돌아와서 이동 전에 Focus를 리셋하게 배치해줌
그럼 이동 전에 포커스를 놓고, 공격하기 전에 포커스를 잡는 로직이 됨

잘 동작하는 모습

0개의 댓글