[UE4] EnemyAI -5 : Appoach, Equip (WeaponAsset 공유 문제, WeaponData)
Enemy AI의 공격(Action) 기능을 구현해보았다.
가장 먼저, 공격하기 위해선 무기를 장착해야 하기 때문에 Task_Equip 클래스를 작성하였다.
💻 CBTTaskNode_Equip
Equip ExecuteTask 에서는 EnemyAI가 가지고 있는 Weapon Component를 참조하여, SetSwordMode를 적용시켜 주었다.
Tick 함수에서는 Enemy_AI의 State Component가 Idle 모드인 경우 Equip Task를 성공으로 종료시키도록 하였다.
Sword 모드의 장착이 끝나면 자연스럽게 Idle 모드로 전환되기 때문이다.
❌ Equip 발동 시 문제점 : Weapon Asset 공유 문제
Equip 발동 시 나타나는 문제점이 있는데, 바로 두명의 Enemy와 Player가 모두 연동되어 랜덤으로 세명 중 한명의 캐릭터가 Equip을 발동시킨다는 것이다.
즉, 나는 Enemy_1 과 Enemy_2중에 Enemy_1에 접근하여 Equip Task를 발동시켰지만, Enemy_2 가 Equip을 수행하거나, 플레이어가 Equip을 수행한다는 의미이다.
이는 Weapon Component에서 가지고있는 Weapon Asset 객체들이 공유되고 있기에 발생하는 문제점이다.
CWeaponAsset
-> 생성 -> CWeaponData
이를 해결하기 위해선 WeaponAsset 에서 공유되는 데이터들을 WeaponData 라는 별도의 클래스로 한번 더 나누면 된다.
⭕ WeaponData 클래스 생성
DoActionDatas 나, HitDatas 같은 데이터는 공유되어도 상관없는 객체이기 때문에 그대로 두고, Class들로 만들어져 별도로 관리되어야 하는 Attachment나, Equipment, DoAction, SubAction 객체들은 WeaponData 라는 클래스로 나누었다.
CWeaponData 관련한 접근은 모두 CWeaponAsset을 통해 이루어지도록 구현하기 위해, CWeaponData 클래스에 friend CWeaponAsset 명령어를 선언해주었고, CWeaponData의 모든 변수는 private 접근 지정자를 설정하였다.
즉, CWeaponAsset을 통해서만 CWeaponData에 접근할 수 있는 것이다.
💻 CWeaponAsset
WeaponAsset 클래스의 BeginPlay 함수를 조금 수정해주었다.
이전에는 Attachment, Equipment, DoAction, SubAction 객체가 모두 WeaponAsset 클래스에 선언되어 있었기 때문에, BeginPlay 함수에서는 해당 객체들을 NewObject로 초기화 및 생성해주었다.
이젠 CWeaponAsset을 통해 CWeaponData를 초기화해야 하므로, BeginPlay 함수의 매개변수로 초기화 해서 Out 매개변수로 전달할 CWeaponData를 추가하였다.
이후, 각각의 객체들을 nullptr 멤버변수로 선언한 후, 모든 초기화가 끝나면 OutWeaponData에 객체들을 차례로 저장해주었다.
💻 CWeaponComponent
WeaponData를 생성함에 따라 WeaponComponent의 코드들도 조금씩 수정해주었다.
CWeaponData를 WeaponAsset의 크기와 동일한 배열로 선언해주었다.
기존에는 WeaponAsset[Type]을 검사하여 해당 클래스에 있는 객체들을 Get 함수로 불러왔지만, 이젠 WeaponData를 통한 Get 함수 호출을 진행하였다.
![]() |
![]() |
BeginPlay 함수에서는 WeaponAsset 배열인 DataAssets의 BeginPlay를 실행시킬 때 WeaponData 배열인 Datas의 원소들을 두번째 매개변수로 전달하여 초기화시켰고,
SetMode 함수에서는 WeaponData를 통해 Equipment를 불러와 Equip을 수행하였다.
최종적으로 BT_Melee에 Equip Task를 배치하여 프로그램을 수행시켜보았다.
접근(Approach) 동작은 MoveTo Task를 통해 쉽게 구현할 수 있었다.