본문으로 건너뛰기
게임 수학 · 게임 AI 기초집LESSON 16

Behavior Tree 기초

난이도초급
예상 시간55분
선수지식15강의 Blackboard

16강. Behavior Tree 기초

1. 이번 강의에서 해결할 문제

중첩 if가 늘어나 상태 우선순위와 현재 실행 행동을 보기 어렵습니다. 조건은 Decorator, 행동은 Task, 데이터 갱신은 Service로 나눠 트리를 구성합니다.

2. 학습 목표

3. 핵심 개념

공식 Behavior Tree Overview에 따르면 Unreal Behavior Tree는 왼쪽에서 오른쪽, 위에서 아래로 평가하고 이벤트 중심 Decorator Observer를 활용합니다.

  • Selector: 성공할 수 있는 첫 Branch 선택
  • Sequence: 자식이 모두 성공할 때 성공
  • Decorator: Branch 실행 조건
  • Service: Branch가 활성인 동안 주기적으로 데이터 갱신
  • Task: MoveTo, Wait, Attack 같은 실제 행동

Task Node는 여러 AI가 공유할 수 있으므로 Node 객체 멤버에 AI별 mutable 상태를 저장하지 않습니다. 상태는 Blackboard, Task Memory 또는 인스턴싱 정책을 정확히 이해한 뒤 사용합니다.

4. 단계별 실습

C++ · 파일 경로: Source/TopDownSurvival/AI/Tasks/BTTask_FindPatrolLocation.h

BTTask_FindPatrolLocation.h
#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTTaskNode.h"
#include "BTTask_FindPatrolLocation.generated.h"

UCLASS()
class TOPDOWNSURVIVAL_API UBTTask_FindPatrolLocation : public UBTTaskNode
{
GENERATED_BODY()

public:
UBTTask_FindPatrolLocation();

protected:
virtual EBTNodeResult::Type ExecuteTask(
UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;

UPROPERTY(EditAnywhere, Category = "Blackboard")
FBlackboardKeySelector PatrolLocationKey;

UPROPERTY(EditAnywhere, Category = "Patrol", meta = (ClampMin = "100.0"))
float PatrolRadius = 800.0f;
};

C++ · 파일 경로: Source/TopDownSurvival/AI/Tasks/BTTask_FindPatrolLocation.cpp

BTTask_FindPatrolLocation.cpp
#include "AI/Tasks/BTTask_FindPatrolLocation.h"

#include "AIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "NavigationSystem.h"

UBTTask_FindPatrolLocation::UBTTask_FindPatrolLocation()
{
NodeName = TEXT("Find Reachable Patrol Location");
}

EBTNodeResult::Type UBTTask_FindPatrolLocation::ExecuteTask(
UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
AAIController* Controller = OwnerComp.GetAIOwner();
APawn* Pawn = Controller ? Controller->GetPawn() : nullptr;
UNavigationSystemV1* Navigation =
FNavigationSystem::GetCurrent<UNavigationSystemV1>(
Controller ? Controller->GetWorld() : nullptr);
if (!Pawn || !Navigation)
{
return EBTNodeResult::Failed;
}

FNavLocation Location;
if (!Navigation->GetRandomReachablePointInRadius(
Pawn->GetActorLocation(), PatrolRadius, Location))
{
return EBTNodeResult::Failed;
}

OwnerComp.GetBlackboardComponent()->SetValueAsVector(
PatrolLocationKey.SelectedKeyName, Location.Location);
return EBTNodeResult::Succeeded;
}

Blueprint·Behavior Tree 작업

BT_EnemyCombat을 만들고 BB_EnemyCombat을 지정합니다.

BT_EnemyCombat 첫 구조
Root
└─ Selector
├─ Sequence [HasLineOfSight && InAttackRange] → Attack
├─ Sequence [HasLineOfSight] → Move To TargetActor
└─ Sequence → Find Patrol Location → Move To PatrolLocation → Wait

5. 코드와 수학·AI가 동작하는 이유

Selector 왼쪽에 공격을 두면 가장 높은 우선순위가 됩니다. 조건이 false면 다음 Branch로 넘어갑니다. 순찰 위치 Task는 NavMesh가 없거나 위치를 못 찾으면 실패해 Tree가 안전하게 다른 선택을 하게 합니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

Behavior Tree 기초 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Behavior Tree 기초”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2‘조건 검사를 Task로 작성’ 실수를 판단할 때 “Behavior Tree 기초” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

16강. Behavior Tree 기초 미완료 상태