기타/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);