PART 1 - 강의 1/3

AI Controller와 Brain Component

AAIController의 역할과 BrainComponent 아키텍처, Possess/UnPossess 흐름을 이해합니다

01

AAIController의 역할

AI Pawn을 제어하는 핵심 컨트롤러 클래스

AAIController는 AController를 상속하며, AI가 Pawn을 제어하기 위한 진입점입니다. PlayerController가 사람의 입력을 처리하듯, AIController는 BrainComponent를 통해 AI 의사결정을 수행합니다.

C++// MyAIController.h UCLASS() class AMyAIController : public AAIController { GENERATED_BODY() public: AMyAIController(); virtual void OnPossess(APawn* InPawn) override; virtual void OnUnPossess() override; protected: UPROPERTY(EditDefaultsOnly) UBehaviorTree* BehaviorTreeAsset; UPROPERTY(EditDefaultsOnly) UBlackboardData* BlackboardAsset; }; // MyAIController.cpp void AMyAIController::OnPossess(APawn* InPawn) { Super::OnPossess(InPawn); if (BehaviorTreeAsset) { UseBlackboard(BlackboardAsset, Blackboard); RunBehaviorTree(BehaviorTreeAsset); } }

OnPossess에서 BehaviorTree를 시작하면 Pawn이 월드에 배치되자마자 AI가 동작합니다. RunBehaviorTree()는 내부적으로 BrainComponent를 생성합니다.

02

BrainComponent와 Possess 흐름

AI 의사결정의 중심, BrainComponent의 구조

UBrainComponent는 AI 로직의 추상 베이스입니다. UBehaviorTreeComponent가 이를 상속하며, Behavior Tree의 실행 엔진 역할을 합니다. Possess 흐름은 다음과 같습니다:

Possess 흐름
SpawnAI OnPossess UseBlackboard RunBehaviorTree BrainComponent 활성화
주의

UnPossess 시 BrainComponent는 자동으로 정지됩니다. AI를 일시 중지하려면 StopLogic()을 사용하고, 완전 제거 시에만 UnPossess를 호출하세요.

03

AI 스폰과 팀 설정

AIController의 자동 스폰 및 팀 인터페이스

AI Pawn은 AIControllerClass 프로퍼티와 AutoPossessAI 설정으로 AIController의 자동 스폰을 제어합니다. 또한 IGenericTeamAgentInterface를 구현하여 팀 기반 적/아군 판별을 처리합니다.

C++// AI Pawn에서 Controller 자동 스폰 설정 AMyAIPawn::AMyAIPawn() { // 사용할 AIController 클래스 지정 AIControllerClass = AMyAIController::StaticClass(); // 월드에 배치되면 자동 Possess AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; } // AIController에서 팀 인터페이스 구현 class AMyAIController : public AAIController, public IGenericTeamAgentInterface { GENERATED_BODY() private: FGenericTeamId TeamId; public: AMyAIController() { TeamId = FGenericTeamId(1); } virtual FGenericTeamId GetGenericTeamId() const override { return TeamId; } virtual ETeamAttitude::Type GetTeamAttitudeTowards( const AActor& Other) const override { auto* OtherTeam = Cast<IGenericTeamAgentInterface>(&Other); if (OtherTeam && OtherTeam->GetGenericTeamId() != TeamId) return ETeamAttitude::Hostile; return ETeamAttitude::Friendly; } };

AutoPossessAI를 PlacedInWorldOrSpawned으로 설정하면 레벨에 배치하거나 SpawnActor로 생성할 때 모두 자동으로 Possess됩니다.

04

AI 디버깅 도구

AIController와 BrainComponent 실시간 디버깅

UE5는 강력한 AI 디버깅 도구를 제공합니다. GameplayDebugger(' 키)와 Visual Logger를 활용하면 AI의 의사결정 과정을 실시간으로 추적할 수 있습니다.

C++// Visual Logger로 AI 상태 기록 #include "VisualLogger/VisualLogger.h" void AMyAIController::OnPossess(APawn* InPawn) { Super::OnPossess(InPawn); UE_VLOG(this, LogAI, Log, TEXT("AI Possessed Pawn: %s"), *InPawn->GetName()); UE_VLOG_LOCATION(this, LogAI, Log, InPawn->GetActorLocation(), 50.f, FColor::Green, TEXT("Spawn Location")); if (BehaviorTreeAsset) { UseBlackboard(BlackboardAsset, Blackboard); RunBehaviorTree(BehaviorTreeAsset); UE_VLOG(this, LogAI, Log, TEXT("BehaviorTree Started: %s"), *BehaviorTreeAsset->GetName()); } } // GameplayDebugger 활성화: ' 키 + 숫자로 카테고리 전환 // 0: Basic, 1: BehaviorTree, 2: EQS, 3: Perception
디버깅 팁

Gameplay Debugger는 PIE(Play In Editor)에서 ' (작은따옴표) 키로 활성화됩니다. AI Pawn을 선택한 후 숫자 키로 BT, Perception, EQS 등 카테고리별 디버그 정보를 전환할 수 있습니다.

SUMMARY

핵심 요약

  • AAIController는 AI Pawn 제어의 진입점이며 BrainComponent를 소유한다
  • BrainComponent는 BehaviorTreeComponent의 부모 클래스로 AI 의사결정 엔진이다
  • OnPossess에서 Blackboard 초기화 후 BehaviorTree를 실행하는 것이 표준 패턴이다
  • IGenericTeamAgentInterface로 팀 기반 적/아군 판별을 구현한다
  • Visual LoggerGameplay Debugger로 AI 동작을 실시간 디버깅한다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 기본 AI Controller 구현

AAIController를 상속한 커스텀 클래스를 만들고, OnPossess에서 BehaviorTree를 시작하세요. AI Pawn을 레벨에 배치하여 자동으로 BT가 실행되는지 확인합니다.

실습 2: Possess/UnPossess 흐름 테스트

콘솔 명령 또는 게임플레이 이벤트로 AI의 Possess/UnPossess를 반복하세요. BrainComponent의 StartLogic/StopLogic 호출을 로그로 확인하고, 메모리 누수가 없는지 점검합니다.

심화 과제

전투/평화 상태에 따라 RunBehaviorTree()로 다른 BehaviorTree를 동적으로 교체하는 시스템을 구현하세요. Blackboard 데이터 보존과 상태 전이 로직을 포함합니다.