기타/Unreal

[Unreal C++] Behavior Tree 2 (블랙보드 값 이용하기)

푸쿠이 2021. 5. 11. 15:30
참고 문서

책 '이득우의 언리얼 C++ 게임 개발의 정석' Chapter 12

 

Blackboard에 키 추가하기 (무엇을 기억할건지.)

키 이름으로 접근할 수 있도록 Controller에 변수 추가하기

이렇게 만들면, 다른 코드에서 참조하기 편하다.

#pragma once

#include "ArenaBattle.h"
#include "AIController.h"
#include "ABAIController.generated.h"

UCLASS()
class ARENABATTLE_API AABAIController : public AAIController
{
	GENERATED_BODY()
	
public:
	AABAIController();
	virtual void OnPossess(APawn* InPawn) override;
    
/* ----- 추가했음 */
	// 책에는 변수명이 위처럼 작성되어있는데, 아래처럼 작성하는 것이 내 코드 스타일인 것 같다.
	//static const FName HomePosKey;
	//static const FName PatrolPosKey;

	static const FName Key_HomePos;
	static const FName Key_PatrolPos;
/* ----- */

private:
	UPROPERTY()
	class UBehaviorTree* BTAsset;

	UPROPERTY()
	class UBlackboardData* BBAsset;
};
#include "ABAIController.h"
#include "BehaviorTree/BehaviorTree.h"
#include "BehaviorTree/BlackboardData.h"

/* ----- 추가했음 */
const FName AABAIController::Key_HomePos(TEXT("HomePos"));
const FName AABAIController::Key_PatrolPos(TEXT("PatrolPos"));
/* ----- */

AABAIController::AABAIController()
{
	static ConstructorHelpers::FObjectFinder<UBlackboardData> BBObject(TEXT("BlackboardData'/Game/Book/AI/BB_ABCharacter.BB_ABCharacter'"));
	if (BBObject.Succeeded())
	{
		BBAsset = BBObject.Object;
	}
	static ConstructorHelpers::FObjectFinder<UBehaviorTree> BTObject(TEXT("BehaviorTree'/Game/Book/AI/BT_ABCharacter.BT_ABCharacter'"));
	if (BTObject.Succeeded())
	{
		BTAsset = BTObject.Object;
	}
}

void AABAIController::OnPossess(APawn* InPawn)
{
	Super::OnPossess(InPawn);
	if (UseBlackboard(BBAsset, Blackboard))
	{
		RunBehaviorTree(BTAsset);
	}
}

 

이후에 Behavior Tree 노드에서 Key 값을 사용할 때, 이렇게 사용하면 된다.

#include "ABAIController.h"

OwnerComp->GetBlackboardComponent()->GetValueAsVector(AABAIController::Key_HomePos);