https://dev.epicgames.com/documentation/unreal-engine/state-tree-in-unreal-engine?lang=ko
| Behavior Tree | StateTree | |
|---|---|---|
| 기본 철학 | “현재 무엇을 해야 하는가?” | "현재 어떤 상태(State)에 있는가?” |
| 매 틱(또는 이벤트 발생 시) 트리를 탐색하면서 가장 적합한 행동을 찾음 | 상태에 진입하고, 조건에 따라 상태를 전환 | |
| FSM(State Machine) + BT의 장점을 합친 느낌 | ||
| 데이터 관리 방식 | 모든 노드가 Blackboard를 통해 통신 | Property Binding 중심 |
| = 각 객체가 자기 데이터를 가지며, 필요하면 Binding으로 연결 |
바인딩 가능한 데이터를 가진 대표적인 객체들 : Parameter, Context, Evaluator, Condition, Task 등 각 노드/구조체 | | | 중앙 화이트보드에 정보를 적어두고, 모든 직원(Service, Decorator, Task)이 읽는 방식 | 각 직원이 자기 메모장을 가지고 있고 필요한 정보만 서로 연결해서 공유 |
완전 1:1 대응 되지는 않지만, 이해를 위해 비슷한 기능끼리 묶어봄!
| Behavior Tree | StateTree | |
|---|---|---|
| Blackboard | Parameter | |
| AI 상태 대부분이 Blackboard에 존재 |
• Player 위치 • Player와 거리 • 현재 HP | 보통 설정값을 저장 • AttackRange • PatrolRadius • LoseSightTime 실시간 데이터는 주로 Evaluator에 저장 | | | | | | 데이터 수집 | Service | Evaluator | | | • Player 위치 찾기 • Player와 거리 계산 • 현재 HP 계산 (+) • Blackboard 갱신 ⭐ | • Player 위치 찾기 • Player와 거리 계산 • 현재 HP 계산 | | | | [ Evaluator 필요성 ] 중앙 화이트보드 없는 대신, State Tree가 사용할 데이터를 지속적으로 관찰하고 갱신하는 객체. 즉 “관찰자”가 필요
• Task A, B, C 모두 직접 매 틱마다 계산할 수 있지만, 낭비임 • Evaluator가 1회 계산 후, Task A, B, C에 공유 | | | | | | 조건 | Decorator | Condition | | | | | | 행동 | Task | Task |
스테이트 트리는 데이터 바인딩을 사용하여 트리 내에 데이터를 전달
스테이트 트리의 모든 노드에서 사용 가능한 일반 데이터 타입은 4가지

| 데이터 타입 | 설명 |
|---|---|
| **컨텍스트 데이터 | |
| (Context Data)** | • StateTree가 기본적으로 알고 있는 객체들. 예를 들어, AI용 StateTree라면 주체인 AI Actor를 제공 |
• 매번 GetOwner() 호출하는 대신 Context.Actor 로 바로 사용 가능 |
• (예) ‘스마트 오브젝트 비헤이비어’에서 사용하는 스테이트 트리 : 컨텍스트는 사용된 스마트 오브젝트와 이를 사용하는 액터를 의미 → NPC가 "월드에 있는 상호작용 가능한 오브젝트”인 벤치, 자판기, 침대 등에 가면 “Sit, Use, Sleep 과 같은 행동”을 할 수 있도록 스마트 오브젝트와 이를 사용하는 액터 둘 다 제공한다는 뜻?
Context ├ SmartObject (벤치) └ UserActor (NPC) | | 스테이트 트리 파라미터 (State Tree Parameters) | • StateTree를 만들 때 외부에서 값을 넣어줄 수 있는 변수(Parameter)를 정의 • Context가 엔진이 넣어주는 값이라면, Parameter는 사용자가 넣는 값 • Parameter는 주로 “설정값, 외부 입력값” 용도이고, 런타임에 계속 변하는 데이터는 주로 Evaluator가 가짐
• (예) Attack StateTree에서 애니메이션 에셋 파라미터를 사용하면, 적 A, B, C가 같은 StateTree를 재사용하면서 다른 모션을 보여줄 수 있음 (= 함수 인자처럼 생각하기) | | 이벨류에이터 (Evaluators) | • Context나 Parameter에 없는 런타임 계산 데이터를 생성하고 저장하여 StateTree 전체에 공급하는 데이터 제공자 • 런타임 도중 스테이트 트리에서 실행 가능한 별도의 클래스임 (독립적인 객체) • 트리 시작 및 중지 시, 그리고 각 틱마다 커스텀 코드를 실행할 수 있음 • Evaluator끼리도 바인딩 가능 (고급 사용 사례) | | 글로벌 태스크 (Global Tasks) | • State에 들어가야 실행되는 Task가 아니라, StateTree가 살아있는 동안 계속 실행되는 Task • 스테이트 선택에 사용 가능한 영구 데이터가 필요할 때 사용 가능 • Evaluator가 정보 제공자라면, Global Task는 항상 실행되는 Task로 이해하기 • 글로벌 태스크는 트리의 루트 스테이트보다 앞서 시작됨. 즉, 첫 State를 고를 때도 Global Task 데이터 사용 가능
• (예) 시간 시스템이 현재 시간을 결정하는 글로벌 태스크에서 CurrentHour를 계속 갱신하며 낮에는 일하고, 밤에는 잠자도록 |
바인딩 가능 조건 : 이미 실행되어 결과가 존재하는 데이터만 바인딩할 수 있다.
// 아래와 같은 순서이므로,
Enter Condition
↓
Task 실행
↓
Transition Condition
| StateTree 엘리먼트 | 엘리먼트가 바인딩 가능한 데이터 |
|---|---|
| **진입 조건 | |
| (Enter Conditions)** | • 공통 데이터 |
• 모든 부모 스테이트의 태스크 |
| 트랜지션 조건 (Transition Conditions) | • 공통 데이터 • 현재 스테이트 • 모든 부모 스테이트의 태스크 | | 태스크 (Task) | • 공통 데이터 • 현재 스테이트의 이전 태스크 • 모든 부모 스테이트의 태스크 |
이런 제약이 있는 이유
Enter Condition
↓
Task 결과 필요
↓
Task 실행 필요
↓
Enter Condition 통과 필요
| 실제 클래스 | 용도 | 예시 | |
|---|---|---|---|
| StateTreeSchema | 베이스 클래스 | 직접 사용 거의 안 함 | |
| (커스텀 Schema를 만들 때 사용) | |||
| CameraDirectorStateTreeSchema | 카메라용 (Follow Camera, Combat Camera, Boss Camera...) | 카메라 로직 | • BossFightStarted, PlayerDead, CombatStarted 같은 조건으로 전환되는 카메라 상태 머신 |
| StateTree Component | StateTreeComponentSchema | 일반 Actor용 | • BP_Door 의 컴포넌트로써 {열림, 열리는 중, 닫히는 중, 닫힘} 상태 |
| • 문 Actor 하나만 있으면 됨 | |||
| StateTree AI Component | StateTreeAIComponentSchema | AIController 기반 AI용 |