https://dev.epicgames.com/documentation/unreal-engine/state-tree-in-unreal-engine?lang=ko

StateTree 실습에 앞서,


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 |

스테이트 트리 내 데이터 흐름


데이터 타입 설명
**컨텍스트 데이터
(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를 계속 갱신하며 낮에는 일하고, 밤에는 잠자도록 |

실제 클래스 용도 예시
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용

블루프린트 통합