🎮Unreal4/C++

[UE4] EnemyAI -6 : Action, AbortTask

공대 컴린이 2023. 7. 27. 15:05
728x90

Enemy AI의 공격 기능을 구현하기 위해 Action Task 클래스를 작성하였다.

💻 CBTTaskNode_Action

ExecuteTask 함수에서는 Owner의 Weapon Component를 불러와서 현재 장착중인 무기의 공격을 수행하도록 DoAction 함수를 실행시켜주었다.

 

Enemy가 공격하는 도중에 Task_Action이 성공 또는 실패되어 종료된다면, 다음 Task 노드로 흐름이 바뀌기 때문에 공격하고 나서는 EBTNodeResult를 대기 상태인 InProgress로 반환해준다.

 

실제로 Task_Action 노드를 끝내는 처리는 Tick 함수에서 진행한다.

 

TickTask 함수에서는 Enemy가 공격을 끝내고 다시 Idle Mode가 되었는지, 현재 공격이 실행중인지를 나타내는 bInAction변수가 false인지를 검사하는 bool 형을 선언하였다.

 

Weapon Component에서 DoAction 객체를 통해 공격을 수행할 때, DoAction이 호출되는 순간 bInAction 변수가 true로 활성화되고, 공격이 끝나고 나서 EndDoAction이 호출되는 순간 bInAction 변수가 false로 비활성화 된다.

 

따라서 Tick 함수에서 공격상태가 아니고 Idle 상태라면 해당 Task를 성공(Succeeded)으로 반환하며 끝내지도록 구현하였다.

 


💥 Task 중단 예외처리

Task 클래스에는 Task가 중단될 때마다 호출되는 AbortTask 메서드가 존재한다.

이러한 Abort Task 메서드 처리를 추가적으로 작업해주었다.

📌 Action 예외처리

Enemy가 Action 공격을 수행하던 도중, 플레이어에게 공격받거나 하여 충돌처리가 되면, Action Task가 끝나지 않은 상태에서 중단된다.

 

이때, AbortTask 함수가 호출되는데, Abort Task 함수다른 노드(Task)가 실행되거나 노드의 실행이 불필요하게 되었을 때 호출되며 노드의 실행을 즉시 중단하고, 관련된 리소스를 정리하는 데 사용된다.

 

Action 공격이 중단됐을 때, Weapon Component의 BeginAction bool 값을 확인하여 현재 공격이 진행된 상태인지를 검사하였다.

bBeginAction인 bool 변수가 실행됐다면 Enemy는 Begin_DoAction 함수가 호출되어 공격 중일 때 중단되었음을 의미한다.

따라서 해당 경우에는 Begin_DoAction 함수를 강제로 실행시켜 중단된 공격 함수를 재호출하여 실행시켜준다.

 

AbortTask가 끝나기 전에는 End_DoAction 함수를 무조건 호출하여 공격이 끝난 상태로 Enemy를 만든다.

따라서 Action이 어중간하게 중단되어도 깔끔하게 End 처리를 함으로써 다음 공격이나 또다른 Task를 오류없이 실행할 수 있다.

📌 Equip 예외처리

장착(Equip) Task도 Action의 중단 예외처리와 동일하게 수행하였다.

WeaponComponent에서 장착 클래스인 Equipment를 참조하여 bBeginEquip bool 변수를 확인하였다.

 

실행영상을 확인하면, Enemy가 공격하려던 도중 플레이어가 공격해서 중단되더라도 다음 공격을 다시 수행하도록 잘 구현되었다.

728x90