참고 문서
책 '이득우의 언리얼 C++ 게임 개발의 정석' Chapter 12
&
docs.unrealengine.com/ko/InteractiveExperiences/BehaviorTrees/index.html
비헤이비어 트리 (Behavior Tree)
우선순위가 높은 행동부터 실행할 수 있도록 트리 구조로 설계하는 기법이다.
Behavior의 뜻이 행동이다.
블랙보드 (Blackboard)
AI의 기억 저장소이다.
비헤이비어 트리 (Behavior Tree)
AI의 프로세서이다.
블랙보드에 저장된 값을 이용해 어떠한 행동을 할지 결정한다.
Behavior Tree 생성하기
컨텐츠 브라우저에서 우클릭해서 생성하면 된다.
Behavior Tree 실행하기
AIController를 상속받아 ABAIController 클래스를 생성한다.
#pragma once
#include "ArenaBattle.h"
#include "AIController.h"
#include "ABAIController.generated.h"
UCLASS()
class ARENABATTLE_API AABAIController : public AAIController
{
GENERATED_BODY()
};
사용하고자 하는 캐릭터 클래스의 생성자에서 AIController를 부여한다.
#include "ABCharacter.h"
#include "ABAIController.h"
AABCharacter::AABCharacter()
{
AIControllerClass = AABAIController::StaticClass();
AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
}
BT를 사용하기 위해 Build 파일에 "AIModule" 모듈을 추가한다.
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "AIModule" });
BB, BT를 로드해서 가지고 온다.
BT를 실행한다.
#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;
void RunAI();
void StopAI();
private:
UPROPERTY()
class UBehaviorTree* BTAsset;
UPROPERTY()
class UBlackboardData* BBAsset;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "ABAIController.h"
#include "BehaviorTree/BehaviorTree.h"
#include "BehaviorTree/BlackboardData.h"
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);
RunAI();
}
void AABAIController::RunAI()
{
if (UseBlackboard(BBAsset, Blackboard))
{
RunBehaviorTree(BTAsset);
}
}
void AABAIController::StopAI()
{
UBehaviorTreeComponent* BehaviorTreeComponent = Cast<UBehaviorTreeComponent>(BrainComponent);
if (nullptr == BehaviorTreeComponent) return;
BehaviorTreeComponent->StopTree(EBTStopMode::Safe);
}
실행 화면 보기
플레이(Alt + P)를 누르면, Behavior Tree가 동작하는 것을 볼 수 있다.
'Unreal' 카테고리의 다른 글
[Unreal C++] Behavior Tree 3 (태스크 사용하기) (0) | 2021.05.11 |
---|---|
[Unreal C++] Behavior Tree 2 (블랙보드 값 이용하기) (0) | 2021.05.11 |
[Unreal Error] UWidgetComponent::GetUserWidgetObject()가 Null 값을 반환하는 경우 (5) | 2021.05.11 |
[Unreal C++] 액터 컴포넌트 만들기 (0) | 2021.05.10 |
[Unreal C++] 데이터 테이블 만들고, 사용하기 (CSV 파일) (0) | 2021.05.10 |