PART 6 · 강의 1/3

Behavior Tree BP

AI 행동 트리의 구조와 블루프린트 기반 Task, Decorator, Service를 구현합니다

01

Behavior Tree 기본 구조

BT의 노드 타입과 실행 흐름

Behavior Tree(BT)는 AI의 의사결정을 트리 구조로 표현하는 시스템입니다. Root 노드에서 시작하여 왼쪽에서 오른쪽으로, 위에서 아래로 평가합니다.

BT Node Types Root └─ Composite (흐름 제어) ├─ Selector // OR: 자식 중 하나라도 성공하면 성공 ├─ Sequence // AND: 모든 자식이 성공해야 성공 └─ Simple Parallel // 메인 Task + 백그라운드 트리 동시 실행 Decorator (조건부 실행) ├─ Blackboard // Blackboard 키 값 확인 ├─ Cooldown // 재실행 쿨다운 ├─ Loop // 반복 실행 └─ Custom (BP) // 블루프린트로 조건 작성 Task (실제 행동) ├─ Move To // 목표 위치로 이동 ├─ Wait // 대기 ├─ Play Animation// 애니메이션 재생 └─ Custom (BP) // 블루프린트로 행동 작성 Service (주기적 업데이트) └─ // 부모 노드가 활성 상태인 동안 주기적으로 실행

Selector vs Sequence

Composite동작비유
Selector자식을 순서대로 시도, 하나라도 성공하면 전체 성공OR 연산. "이것 또는 저것"
Sequence자식을 순서대로 실행, 하나라도 실패하면 전체 실패AND 연산. "이것 그리고 저것"
02

Blackboard

AI의 기억 저장소 - Blackboard 키와 데이터

Blackboard는 BT가 사용하는 데이터 저장소입니다. AI가 알고 있는 정보(타겟 위치, 현재 상태 등)를 Key-Value 형태로 저장합니다.

Blackboard Keys BB_Enemy (Blackboard Asset) ├─ TargetActor : Object (Base Class: Actor) ├─ PatrolLocation: Vector ├─ HomeLocation : Vector ├─ bHasLineOfSight: Bool ├─ AlertLevel : Enum (Idle, Suspicious, Alert, Combat) └─ DistanceToTarget: Float // Blackboard 값 설정 (AIController에서) [Get Blackboard] ──> [Set Value as Object] ├─ Key Name: "TargetActor" └─ Object Value: DetectedActor // Blackboard 값 읽기 (BT Task에서) [Get Blackboard Value as Object] └─ Key: TargetActor ──> (Actor Reference)
03

커스텀 BT 노드 (블루프린트)

BTTask, BTDecorator, BTService를 블루프린트로 구현

Custom BTTask

콘텐츠 브라우저에서 우클릭 > Blueprint Class > BTTask_BlueprintBase를 선택합니다.

BTTask_Attack (Custom Task) BTTask_Attack (Parent: BTTask_BlueprintBase) [Override: Receive Execute AI] ├─ Owner Controller: AIController └─ Controlled Pawn: Pawn │ ├──> [Get Blackboard Value as Object] (TargetActor) │ └──> [IsValid] │ ├─ Valid ──> [Cast to BP_EnemyCharacter] │ │ └──> [PlayAttackMontage] │ │ └──> [On Montage Ended] │ │ └──> [Finish Execute] (Success: True) │ │ │ └─ Invalid ──> [Finish Execute] (Success: False) // 중요: Latent Task는 반드시 Finish Execute를 호출해야 함! // 호출하지 않으면 BT가 이 노드에서 영원히 멈춤

Custom BTService

BTService_UpdateDistance BTService_UpdateDistance (Parent: BTService_BlueprintBase) // Interval: 0.5 (0.5초마다 실행) [Override: Receive Tick AI] ├─ Owner Controller └─ Controlled Pawn │ ├──> [Get Blackboard Value as Object] (TargetActor) ├──> [Get Distance To] (Pawn, TargetActor) └──> [Set Blackboard Value as Float] ├─ Key: DistanceToTarget └─ Value: Distance
Finish Execute 필수 호출

커스텀 BTTask에서 Finish Execute 노드를 반드시 호출해야 합니다. 이 노드를 호출하지 않으면 BT가 해당 Task에서 영원히 대기하며 다음 노드로 진행하지 않습니다. Latent(비동기) 작업을 수행한 후 콜백에서 Finish Execute를 호출하세요.

04

실전 AI Behavior Tree

순찰-추적-공격 패턴의 완전한 BT 구현

Complete Enemy BT BT_Enemy └─ Root └─ Selector (최상위: 우선순위 행동 선택) │ ├─ Sequence "Combat" [Decorator: Blackboard - TargetActor IS SET] │ ├─ Service: UpdateDistance (0.5s) │ ├─ Selector "Attack or Chase" │ │ ├─ Sequence "Attack" [Decorator: DistanceToTarget < 200] │ │ │ ├─ Task: Face Target (TargetActor) │ │ │ └─ Task: BTTask_Attack │ │ │ │ │ └─ Sequence "Chase" │ │ └─ Task: Move To (TargetActor, AcceptableRadius: 180) │ │ │ └─ Task: Wait (0.5s) // 짧은 딜레이 후 재평가 │ └─ Sequence "Patrol" ├─ Task: BTTask_FindPatrolPoint ──> PatrolLocation ├─ Task: Move To (PatrolLocation, AcceptableRadius: 50) └─ Task: Wait (Random: 2.0 ~ 5.0s)

AI Controller 설정

AI Controller Blueprint // BP_EnemyAIController [Event BeginPlay] └──> [Run Behavior Tree] └─ BT Asset: BT_Enemy // Enemy Character에서 AI Controller 지정: // Class Defaults > Pawn > AI Controller Class: BP_EnemyAIController // Class Defaults > Pawn > Auto Possess AI: Placed in World or Spawned
BT 디버깅

PIE 중에 AI 캐릭터를 선택하면 에디터의 Behavior Tree 에셋에서 현재 실행 중인 노드가 녹색 하이라이트로 표시됩니다. Blackboard 값도 실시간으로 확인할 수 있습니다. showdebug ai 콘솔 명령도 유용합니다.

SUMMARY

핵심 요약

  • Behavior Tree는 Composite(Selector/Sequence), Decorator(조건), Task(행동), Service(주기 업데이트)로 구성된다
  • Selector는 OR(하나만 성공), Sequence는 AND(모두 성공) 로직이다
  • Blackboard는 AI의 기억 저장소로, Key-Value 형태로 데이터를 관리한다
  • 커스텀 BTTask에서 Finish Execute를 반드시 호출해야 BT가 진행된다
  • AIController의 Run Behavior Tree로 BT를 시작한다
  • 순찰-추적-공격 패턴은 Selector로 우선순위를 정하고 Sequence로 순서를 보장한다
PRACTICE

도전 과제

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

실습 1: 기본 순찰 AI 만들기

AIController, Blackboard, BehaviorTree를 생성하세요. Blackboard에 PatrolLocation(Vector) 키를 추가하고, BT에서 Selector → Sequence(Move To → Wait) 구조로 순찰 포인트를 이동하는 AI를 만드세요. BTTask_BlueprintBase로 커스텀 Task를 구현하세요.

실습 2: Decorator와 Service 구현

BTDecorator_BlueprintBase로 IsPlayerInRange Decorator를 만들어 플레이어 거리를 확인하세요. BTService_BlueprintBase로 UpdatePlayerLocation Service를 만들어 0.5초마다 Blackboard에 플레이어 위치를 업데이트하세요.

심화 과제

순찰 → 추적 → 공격 → 복귀 4단계 행동 전환을 가진 적 AI를 구현하세요. Blackboard의 TargetActor 키가 설정되면 추적 모드로 전환하고, 공격 범위에 들어오면 공격, 타겟을 잃으면 마지막 위치로 이동 후 순찰로 복귀하세요.