언리얼 엔진에서 캐릭터는 controller의 지배를 받는다. 이를 빙의(Poss)라고 부른다.
player character가 만들어지게 되면 player controller가 종속적으로 만들어지게 되고 player character는 player controller에 빙의 된다. 그 후 player의 keydown에 따라 설정된 함수가 실행된다.
AI Character도 마찬가지로 AI Controller의 지배를 받게 된다. AI의 행동은 BehavierTree에 의해 결정된다.
AIControllerClass = AMainEnemyAIController::StaticClass();
AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
static ConstructorHelpers::FObjectFinder<UBlackboardData> BBObject(TEXT("BlackboardData'/Game/AMyDirectory/Enemy/AI/BB_MainEnemy.BB_MainEnemy'"));
if (BBObject.Succeeded())
{
BBAsset = BBObject.Object;
}
if (!RunBehaviorTree(BTAsset))
{
UE_LOG(LogTemp,Error, TEXT("AIController couldn't run behavior tree!"));
}
AiController에서 움직임 관련 함수(MoveTo 계열)을 사용하게되면 해당 위치까지의 길을 찾아 움직이게 된다. 즉, 방해물을 돌아서 간다는 뜻이다. 이러한 기능을 위해 Level에 NavMeshBoundsVolume가 navigation원하는 위치에 있도록 설정해주어야 한다.('P'키를 눌러 확인가능)
Behavior Tree에서 사용할 변수를 저장하는 역할을 한다. 보통 AIController class와 연동해서 값 제어한다.
public:
static const FName HomePosKey;
static const FName PatrolPosKey;
static const FName TargetKey;
static const FName CanSeePlayerKey;
const FName AMainEnemyAIController::HomePosKey(TEXT("HomePos"));
const FName AMainEnemyAIController::PatrolPosKey(TEXT("PatrolPos"));
const FName AMainEnemyAIController::TargetKey(TEXT("Target"));
const FName AMainEnemyAIController::CanSeePlayerKey(TEXT("CanSeePlayer"));
AICharacter의 행동을 판단한다.
언리얼엔진의 Behavior Tree와 전통적인 Behavior Tree와 달리 이벤트로 주도되기 때문에 프레임 마다 불필요한 작업이 수행되지않는다.
언리얼엔진의 Behavior Tree는 단순 병렬, 서비스, 데코레이터를 사용하여 동일한 유현의 행동을 달성한다.
2
해당 트리의 고유한 트리로 몇가지 특별한 규칙을 가진다.
분기의 루트와 해당 분기가 실행되는 방식의 기본 규칙을 정의한다.
Selector
Sequence
Simple Parallel
실행할 수 있는 액션을 나타내며, 출력 연결을 갖지 않는다.
다른 노드에 Attach되어 트리의 분기나 단일 노드의 실행여부를 결정한다.
Composite Nodes에 Attach되며, 자신의 분기가 실행되는 동안에 한해 정의된 주기로 실행된다. 보통 블랙보드의 확인 및 업데이트에 사용되며, 전통적인 비헤이비어 트리의 병렬 노드를 대체한다.