목차

1. Behavior Tree(비헤이비어 트리)

2. Black Board(블랙보드)

3. AI Controller

4. NavMesh


1. Behavior Tree (비헤이비어 트리)

비헤이비어 트리는 AI의 행동을 결정하는 계층적 구조를 가진 트리. 각 노드(Node)에는 특정 역할이 있으며, AI는 루트(Root) 노드에서 시작하여 조건에 따라 적절한 행동을 수행.

1-1. 비헤이비어 트리의 주요 노드 유형

  • Root 노드: 트리의 시작점
  • Composite 노드 (합성 노드): 여러 개의 하위 노드를 가질 수 있음
    • Selector (선택자): 왼쪽부터 실행하며, 성공하는 노드를 찾으면 중단
    • Sequence (시퀀스): 왼쪽부터 순서대로 실행하며, 하나라도 실패하면 중단
  • Decorator 노드 (데코레이터 노드): 특정 조건을 검사하여 실행 여부를 결정
  • Task 노드 (태스크 노드): AI가 수행할 실제 동작 (ex. 이동, 공격)


2. Blackboard (블랙보드)

AI가 정보를 저장하고 공유하는 데이터 저장소.

비헤이비어 트리와 함께 사용되며, AI의 의사 결정에 필요한 변수(위치, 상태 등)를 관리.

2-1 블랙보드의 주요 기능

  • 키(Key) 시스템: 데이터 항목을 저장하는 변수 (ex. TargetLocation, HasEnemy)
  • AI가 환경 정보를 저장하고 활용 가능
  • 비헤이비어 트리 내에서 데코레이터 또는 태스크 노드를 통해 활용


3. AI Controller (AI 컨트롤러)

  • AI 캐릭터를 제어하는 핵심 클래스
  • AI가 어떤 논리를 따라야 하는지 결정하고, Behavior Tree를 실행하는 관리자.
    •   예: AI의 상태(Idle, Chase 등) 전환 관리

3-1. AIController의 주요 역할

  • 비헤이비어 트리 및 블랙보드 초기화
  • AI 이동 및 감지 기능 (Perception System)
  • Pawn(캐릭터) 제어 및 명령 전달

3-2. AI Controller 설정 과정

  1. AIController 클래스를 생성하고 AController를 상속
  2. UseBlackboard() 함수로 블랙보드를 초기화
  3. RunBehaviorTree() 함수로 비헤이비어 트리 실행
  4. Possess() 함수를 오버라이드하여 AI 캐릭터를 제어
#include "MyAIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "BehaviorTree/BehaviorTree.h"

void AMyAIController::BeginPlay()
{
    Super::BeginPlay();

    if (UseBlackboard(BlackboardAsset, Blackboard))
    {
        RunBehaviorTree(BehaviorTree);
        
        // 블랙보드에 초기 목표 위치 설정
        FVector RandomLocation(1000.0f, 500.0f, 0.0f);
        Blackboard->SetValueAsVector(TEXT("PatrolLocation"), RandomLocation);
    }
}
 

4. NavMesh (내비게이션 메시)

  • AI가 이동할 수 있는 경로를 결정하는 내비게이션 시스템.

4-1. NavMesh 설정 방법

  1. NavMesh Bounds Volume 추가
    • Modes 패널에서 Nav Mesh Bounds Volume을 배치
    • AI가 이동할 수 있는 영역을 지정
  2. RecastNavMesh 확인
    • World Settings에서 RecastNavMesh 활성화
  3. AI 이동을 위한 Pathfinding
    • GetNavAgentLocation() 및 FindPathToLocation() 등의 함수를 사용 가능

4-2. AI가 NavMesh를 활용해 이동하는 코드 예제

UNavigationSystemV1* NavSys = FNavigationSystem::GetCurrent<UNavigationSystemV1>(this);
FNavLocation NavLocation;

if (NavSys->GetRandomPointInNavigableRadius(GetActorLocation(), 500.0f, NavLocation))
{
    MoveToLocation(NavLocation.Location);
}

AI가 500 유닛 반경 내에서 랜덤한 위치를 찾아 이동하는 방식.

 


참조: Behavior Tree Quick Start Guide

'TIL > C++와 UE' 카테고리의 다른 글

머티리얼 조작  (0) 2025.02.25
Enemy(Monster) 클래스  (0) 2025.02.24
파티클 시스템  (0) 2025.02.11
게임 메뉴 UI 디자인  (0) 2025.02.07
Pawn 클래스 캐릭터의 부드러운 움직임  (1) 2025.02.05