[UE4] Enemy AI -4 : 근접(Melee) AI 완성 (Equip Task, Action Task, Hitted Task)
👊 완성된 근접(Melee) 비헤이비어 트리 : BT_Melee
Enemy가 플레이어를 감지하고 추적할 때 일정거리 안에 도달하면 Enemy를 공격(Action) 상태로 만들어 공격하는 AI 기능을 구현하였다. ( 이전에 AI 와 플레이어의 거리가 150 이하이면 Action 상태로 변화하도록 구현해놓았다. )
공격을 하기에 앞서 Enemy가 먼저 Weapon을 장착(Equip)해야 하기 때문에 장착을 먼저 구현하였다.
1. 무기 장착하기 - Equip Task : BTTask_Equip
Equip Task가 실행되면 무기 장착에 관한 조건문이 차례로 실행된다.
이미 무기가 장착되어있다면 바로 성공을 반환하는 Finish 함수를 호출하고, 장착되어있지 않다면 Sword, Warp, FireBall 종류에 한해 무기 장착 상태가 되도록 Weapon Mode를 변경해주었다.
이렇게하기만 한다고 무기 장착이 끝나는 것은 아니다!
무기가 장착되는 몽타주가 실행되기 때문에 장착까지 시간이 걸리는걸 기다려줘야 한다.
따라서 Tick AI 이벤트를 통해 Equip이 전부 끝났는지를 검사해야 한다.
Equip 몽타주가 끝날 때 호출되는 End Equip 함수에서는 InEquipping을 False로 바꾸고, State를 Idle 모드로 변경한다. 이를 그대로 조건문에 비교하여 장착이 수행되고 End까지 정상적으로 수행되었는지를 확인하였다.
만약 Enemy의 Equip 과정 도중에 플레이어가 공격을 하면 Equip 몽타주가 끝까지 실행되지 않고 중단되어 End Equip이 호출되지 않는다. 그렇다면 Tick AI에서 비교하는 조건문들에 평-생 만족하지 못할것이다.
이런 경우를 방지하여 Abort AI 이벤트를 통해 Task가 중단되는 경우를 추가로 검사하였다.
🚩 Equip 몽타주
|------- 타격 ------ Begin ------------------ End -------|
|--------------------- Begin ---- 타격 ------ End -------|
WeaponComponent는 가지고 있지만, In Equipping 변수가 True라면 Begin Equip 함수가 실행됐지만 End Equip전에 중단된 상태이므로 End Equip 함수를 호출하여 강제 종료시켜준다.
반대로, In Equipping 변수가 False라면 Begin Equip 함수도 호출되지 않은 경우이기 때문에 Begin Equip과 End Equip 을 둘다 호출하여 강제 종료 시켜주었다.
2. 공격하기 - Action Task : BTTask_Action
무기 장착(Equip)이 끝나면 AI 가 공격하도록 Action Task를 작성해주었다.
Action Task는 Equip Task와 거의 유사하다. Task가 실행되면 움직이지 않도록 Stop Movement 함수를 적용하고, 공격 함수인 Do Action을 호출하였다.
Equip과 마찬가지로 Action 몽타주가 실행되고 End Action까지 진행되었는지를 판단하고, Action 도중에 플레이어에게 공격받거나 하여 중단되면 강제로 Action을 종료해주었다.
3. 데미지 처리 - Hitted Task : BTTask_Hitted
마지막으로 AI 가 데미지를 입는 Hitted Task를 작성해주었다.
데미지를 입는 Hitted는 맞는 순간 모든 행동이 초기화된다. 따라서 루트 노드 바로 다음에 가장먼저 Hitted 상태인지를 판단하도록 비헤이비어 트리 구조를 작성하였다.
3-1. Enemy AI 클래스
Enemy AI의 부모 클래스인 BP_Enemy_AI에 State가 Hitted로 변경될 때마다 Behavior Type을 Hitted로 바꾸는 코드가 작성되어있기 때문에, 플레이어가 Enemy를 공격하면 비헤이비어 트리의 Hitted 노드가 실행된다.
3-2. End_Hitted 노티파이
Hitted 몽타주의 끝 지점에 End Hitted 노티파이를 생성하여 붙여주었다.
Hitted가 끝나면 State를 Idle모드로 설정하고, AI Controller를 가지고있고, 블랙보드를 가지고 있다면 Behavior Type을 Wait 상태로 전환해주었다.
3-3. Hitted Task
Hitted Task가 실행되면 움직일 수 없도록 Stop Movement를 호출하고, 블랙보드의 Behavior Type을 Hitted 상태가 아닌 경우 Task를 성공으로 탈출하도록 구현하였다.
AI가 Hitted 상태가 되면 데미지 처리를 모두 끝낸 후 (2번 내용처럼) Behavior 타입을 Wait으로 변경하기 때문에 Hitted 상태가 아니라면 Task를 바로 탈출시키는 것이다.
결과적으로, Enemy AI가 순찰을 돌다가, 플레이어를 발견하면 추적하고 가까이오면 무기를 장착한 뒤 공격하는 근접 AI 가 완성되었다. 또한 플레이어에게 데미지를 입는 순간, Hitted 몽타주를 실행하고 데미지 처리가 끝난 후 다시 상태에 맞는 AI가 실행된다.