0. 개요

비헤이비어 트리 컴포넌트와 블랙보드 컴포넌트를 가지는 AI 컨트롤러를 생성한다.

 

 

1. AIController 생성

(1) Aura.Build.cs에 AI 모듈 추가하기

using UnrealBuildTool;

public class Aura : ModuleRules
{
	public Aura(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayAbilities", "UMG" });

		PrivateDependencyModuleNames.AddRange(new string[] { "GameplayTags", "GameplayTasks", "NavigationSystem", "Niagara", "AIModule" });

AI 관련 기능을 사용하기 위해 AI모듈을 추가한다.

 

 

(2) AuraAIController

AIController를 상속받는 커스텀 AI 컨트롤러를 생성한다.

#pragma once

#include "CoreMinimal.h"
#include "AIController.h"
#include "AuraAIController.generated.h"

class UBlackboardComponent;
class UBehaviorTreeComponent;

/**
 * 
 */
UCLASS()
class AURA_API AAuraAIController : public AAIController
{
	GENERATED_BODY()

public:
	AAuraAIController();

protected:
	UPROPERTY()
	TObjectPtr<UBehaviorTreeComponent> BehaviorTreeComponent;
};

비헤이비어 트리 컴포넌트를 생성한다.

블랙보드 컴포넌트는 부모 클래스인 AI Controller에 Blackboard로 존재한다.

#include "AI/AuraAIController.h"
#include "BehaviorTree/BehaviorTreeComponent.h"
#include "BehaviorTree/BlackboardComponent.h"

AAuraAIController::AAuraAIController()
{
	Blackboard = CreateDefaultSubobject<UBlackboardComponent>("BlackboardComponent");
	check(Blackboard);

	BehaviorTreeComponent = CreateDefaultSubobject<UBehaviorTreeComponent>("BehaviorTreeComponent");
	check(BehaviorTreeComponent);
}

 

 

(3) AuraEnemy에 비헤이비어 트리와 AI 컨트롤러 추가

	UPROPERTY(EditAnywhere, category="AI")
	TObjectPtr<UBehaviorTree> BehaviorTree;

	UPROPERTY()
	TObjectPtr<AAuraAIController> AuraAIController;
};

 

 

(4) PossessedBy 함수 오버라이드

UCLASS()
class AURA_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface
{
	GENERATED_BODY()
	
public:
	AAuraEnemy();
	virtual void PossessedBy(AController* NewController) override;
void AAuraEnemy::PossessedBy(AController* NewController)
{
    Super::PossessedBy(NewController);

    AuraAIController = Cast<AAuraAIController>(NewController);
}

이 함수는 액터가 컨트롤러를 갖게 되는 순간에 호출되는 함수이다.

컨트롤러를 캐스팅하여 AuraAIController 멤버 변수에 저장한다.

 

 

(5) Aura AI Controller 블루프린트 생성

Aura AI Controller 클래스를 상속받는 블루프린트를 생성한다.

이후 BP_EnemyBase에서 기본 AI 컨트롤러 클래스를 방금 생성한 블루프린트로 지정한다.

 

 

2. 비헤이비어 트리와 블랙보드

(1) 비헤이비어 트리와 블랙보드 생성

컨텐츠 서랍 우클릭 - 인공지능 - 블랙보드, 비헤이비어 트리를 클릭하여 생성한다.

 

 

(2) BP_EnemyBase에 비헤이비어 트리 설정

이전에 AuraEnemy에서 생성했던 멤버 변수에 비헤이비어 트리를 지정한다.

 

 

3. 비헤이비어 트리 실행

비헤이비어 트리와 블랙보드를 구성하기 전에 C++ 코드에서 비헤이비어 트리를 작동하도록 할 것이다.

 

 

(1) AuraEnemy의 PossessedBy 함수에서 RunBehaviorTree 함수 호출하기

void AAuraEnemy::PossessedBy(AController* NewController)
{
    Super::PossessedBy(NewController);

    // 클라이언트는 복제로 제공받음
    if (!HasAuthority())
        return;

    AuraAIController = Cast<AAuraAIController>(NewController);

    // 블랙보드 초기화
    AuraAIController->GetBlackboardComponent()->InitializeBlackboard(*BehaviorTree->BlackboardAsset);
    
    // 비헤이비어 트리 작동
    AuraAIController->RunBehaviorTree(BehaviorTree);
}

- AI는 서버에서 작동하고 클라이언트로 복제한다.

- 비헤이비어 트리를 작동하기 전에 블랙보드를 초기화해야 한다.

GetBlackboardComponent는 빈 블랙보드 컴포넌트인 Blackboard 멤버 변수를 반환한다.

이 컴포넌트를 비헤이비어 트리 내의 블랙보드로 초기화한다.

 

 

(2) 테스트

애니메이션을 재생하도록 트리를 구성하여 적절하게 재생되는지 확인한다.