본문으로 건너뛰기
게임 수학 · 게임 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 기초 미완료 상태