🎮Unreal4/C++

[UE4] EnemyAI -1 : BehaviorTree, BlackBoard, AIController

공대 컴린이 2023. 7. 3. 16:26
728x90

Enemy AI 전투를 구현하기 위해 EnemyAI 클래스를 생성하였다.

💻 CEnemyAI 클래스 생성

CEnemy_AI 클래스에는 비헤이비어 트리 객체와, 공격을 위한 Weapon 컴포넌트, AI의 전반적인 기능을 구현한 Behavior 컴포넌트가 있다.

📺 비헤이비어 트리, 블랙보드

가장 먼저, 근접 Enemy인 Melee Enemy를 구현하기 위해 비헤이비어 트리인 BT_Melee와, 블랙보드인 BB_Melee를 각각 생성하고 연결해주었다.

 

BB_Melee 블랙보드에는 EnemyAI 가 공격 대상으로 삼을 Target(Character형)과, 이동 위치(Location)을 키 값으로 갖는다. (추후에 Behavior Tree Enum값이 추가될 예정이다.)

📦 Behavior Component

Behavior 컴포넌트에는 AI의 상태를 나타내는 EAIStateType 열거형과, 블랙보드의 Key 값들을 가져올 때 사용할 FName들을 각각 선언해주었다.

 

이후, 각각의 AI Type을 검사할 수 있는 Is~() 함수들과, 상태를 변경시킬 수 있는 Set~Mode() 함수들을 선언하였다.

 

GetType, Target, Location 함수는 각각 블랙보드에서 GetValueAs 함수를 통해 값을 불러오도록 구현하였다.

 

Is 함수 Set 함수들을 각각 초기화하고, ChangeType 함수에서는 블랙보드의 SetValueAsEnum 함수를 통해 AIStateTypeKey 값을 변경해주고, AI State Type Changed 델리게이트에 등록된 함수들을 호출했다.

🗼CAIController

AI 시스템의 핵심인 AI Controller 클래스를 생성하였다.

모든 EnemyAI가 공동적으로 상속받을 CAIController 클래스를 작성하였고, AAIController를 상속받아 구현하였다.

 

AIController에서는 Controller가 빙의될 객체CEnemy_AI 캐릭터와, AIBehavior 컴포넌트 객체를 변수로 가지고 있도록 하였다.

 

생성자에서는 AAIController인 부모 클래스에 존재하는 Blackboard 변수를 초기화하기 위해 Blackboard Component를 생성해주었다.

 

Controller가 Enemy에게 빙의되는 순간 호출되는 OnPossess 함수에서는 빙의된 Enemy 객체를 불러왔고,

해당 Enemy가 가지고있는 비헤이비어 트리를 가져와 Blackboard와 비헤이비어 컴포넌트를 초기화해주었다.

 

이후, RunBehaviorTree 함수를 호출하여 트리를 재생시켰다.

 

💡 까먹지 말아야 하는것은 Build.cs 파일에 AIModule을 추가해야 성공적인 컴파일이 완성될 수 있다.

 

컴파일 후 CEnemy_AI 클래스를 기반으로하는 근접 Enemy(BP_CEnemy_AI_Melee)를 생성하고, 

CAIController를 기반으로하는 BP_CAIController_Melee 블루프린트를 생성해준다.

 

이후, Enemy 클래스에는 Behavior Tree와, AI Controller Class를 생성한 BP_CAIController_Melee로 설정해주었다.

 

컴파일 후, 비헤이비어 트리의 실행유무를 판단하기 위한 테스트 노드들을 배치하고, 확인해보면 성공적으로 트리가 작동되고 있는것을 확인할 수 있었다.

728x90