State Tree와 Behavior Tree는 둘 다 AI 의사결정 구조를 만드는 도구이지만, 내부 모델과 실행 방식이 다르다.
공식 문서를 기준으로 보면, Behavior Tree는 Blackboard를 중심으로 분기 로직을 실행하는 구조이고, State Tree는 계층형 상태 머신에 가까운 구조다.
Behavior Tree
Unreal의 Behavior Tree는 트리 형태의 분기 구조를 따라 현재 실행할 로직을 결정하는 방식이다.
Task, Decorator, Service를 조합해서 AI의 행동 우선순위를 만들고, 필요한 데이터는 Blackboard에 저장한다.
공식 문서에서 특히 강조하는 부분은 Unreal의 Behavior Tree가 event-driven이라는 점이다.
전통적인 형태처럼 모든 조건을 매 프레임 단순 반복 평가하는 것이 아니라, Blackboard 값 변화나 관련 이벤트를 기반으로 트리의 실행 흐름을 바꾼다.
이 구조는 다음과 같은 상황에 잘 맞는다.
- 순찰, 추적, 공격처럼 우선순위가 자주 바뀌는 AI
- Blackboard를 중심으로 조건 분기가 많은 AI
- 이미 Behavior Tree 기반 자산과 워크플로우가 익숙한 팀
State Tree
State Tree는 Unreal 공식 문서에서 hierarchical state machine으로 설명된다.
동시에 behavior tree의 selector 개념과 state machine의 state, transition 개념을 함께 가진 구조로 소개된다.
상태를 하나 선택하고 끝나는 것이 아니라, 루트부터 선택된 leaf state까지의 활성 경로 전체가 살아 있다는 점 때문에.
선택된 state와 그 부모 state들은 모두 active 상태가 되고, 그 안에 있는 task들도 함께 실행된다.
상태 재선택이 항상 매 프레임 전체 탐색으로 일어나는 것이 아니라, transition을 기준으로 필요할 때만 일어난다.
이 구조는 다음과 같은 상황에 잘 맞는다.
- 상태 전환이 분명한 AI
- 계층형 상태 관리가 중요한 로직
- 여러 task를 한 상태 안에서 함께 돌리고 싶은 경우
- Behavior Tree보다 상태 중심으로 읽히는 구조가 필요한 경우
State Tree의 실행 방식
State Tree는 상태를 선택하는 과정과 선택된 상태가 유지되는 방식이다.
State Tree는 처음 실행될 때 root에서 시작해서 아래로 내려가며 state를 선택한다.
이때 각 state는 자신의 Enter Condition을 검사하고, 조건을 통과하면 자식 state 선택으로 계속 내려간다.
더 이상 내려갈 자식이 없으면 그 leaf state가 선택된다.
선택된 leaf state 하나만 켜지는 것이 아니라, root부터 leaf까지 이어지는 경로 전체가 active 상태가 된다.

위 사진 경우 Attack Enemy 경로까지 active한 상태다.
이 구조 때문에 State Tree는 단순한 "현재 상태 하나"보다, "현재 활성화된 상태 경로"를 가진다고 보는 편이 더 정확하다.
또한 각 active state는 task를 가질 수 있고, 이 task들은 상태가 유지되는 동안 함께 실행된다.
공식 문서 기준으로는 active state의 task들이 동시에 실행되며, transition이 발생할 때까지 계속 유지된다.
또한 state에 속한 별도의 파라미터를 가질 수 있다.
State Tree는
- state selection은 위에서 아래로 내려가며 일어난다.
- active 상태는 leaf 하나가 아니라 경로 전체다.
- task는 active state 경로에서 함께 살아 있다.
- transition이 일어나기 전까지 현재 상태 구성이 유지된다.
Transition 동작
Behavior Tree와 비교할 때 State Tree가 더 state machine처럼 느껴지는 이유는 transition 때문이다.
State Tree에서 상태 변경은 기본적으로 transition이 트리거할 때 발생한다.
transition 트리거는 크게
- 어떤 task가 Succeeded / Failed / Completed 상태가 됨
- 감시 중인 condition이 만족됨
- 그 외 state 완료 흐름에 연결된 전이 조건이 충족됨
일 때 발생한다.
transition은 leaf state에서 시작해서 부모 쪽으로 올라가며 검사된다.
그 과정에서 가장 먼저 성공한 transition이 다음 상태 선택을 시작한다.
다음처럼 쓰기 쉽다.
- 하위 공격 state에서만 적용되는 짧은 전환
- 상위 전투 state 전체에 적용되는 공통 탈출 전환
- 루트 가까운 곳에 두는 전역적인 예외 처리
그래서 State Tree는 상태를 많이 나누더라도, transition 책임을 계층적으로 정리하기가 좋다.
Data Binding
State Tree에서 자주 쓰는 공용 데이터는 다음과 같다.
- Parameters
- Context Data
- Evaluators
- Global Tasks

Parameters는 외부에서 tree에 넣어 주는 입력값이다.
Context Data는 현재 tree가 어떤 대상 위에서 실행되는지에 따라 제공되는 기본 데이터다.
Evaluators는 tree 실행 중 참조할 값을 노출하거나 갱신하는 별도 노드이고
Global Tasks는 tree가 시작부터 끝날 때까지 유지되는 전역 task에 가깝다.
이 데이터 구조 때문에 State Tree는 상태 선택과 task 실행에 필요한 데이터를 체계적으로 바인딩하는 도구로써 사용된다.
Behavior Tree가 Blackboard를 중심으로 생각되었다면, State Tree는 binding 가능한 데이터 원천이 더 세분화되어 있다.
차이
Behavior Tree는 기본적으로 분기 구조 안에서 어떤 branch를 실행할지 결정하는 쪽에 가깝다.
반면 State Tree는 현재 어떤 상태가 활성화되어 있는지, 그리고 어떤 transition으로 다음 상태로 넘어갈지를 더 직접적으로 다룬다.
정리하면 이렇게 볼 수 있다.
Behavior Tree: 조건 분기와 우선순위 기반 실행에 강하다.State Tree: 상태 유지와 전환 흐름 표현에 강하다.
또한 데이터 흐름도 다르다.
- Behavior Tree는 Blackboard가 중심이다.
- State Tree는 parameter, context data, evaluator, task output 같은 바인딩 구조를 더 적극적으로 사용한다.
직관성
이 부분은 AI의 성격에 따라 달라진다.
순찰하다가 플레이어를 보면 추적하고, 사거리에 들어오면 공격하고, 다시 놓치면 순찰로 돌아가는 식의 전형적인 AI는 Behavior Tree가 직관적으로 보일 수 있다.
우선순위가 바뀔 때 어떤 branch가 살아나는지 눈으로 따라가기 쉽기 때문이다.
반대로 대기 상태, 전투 상태, 경직 상태, 도주 상태처럼 상태 자체가 중요한 AI는 State Tree가 더 자연스럽다.
현재 어떤 state가 active인지와, 어떤 조건이 transition을 일으키는지가 더 직접적으로 드러난다.
사용
둘 중 무엇이 더 우월하다고 보기는 어렵다.
기준은 AI를 어떤 방식으로 설명하고 싶은가에 더 가깝다.
Behavior Tree가 유리한 경우는 다음과 같다.
- 우선순위 분기가 많은 경우
- Blackboard 기반 판단이 중심인 경우
- 기존 Unreal AI 워크플로우를 그대로 활용하고 싶은 경우
State Tree가 유리한 경우는 다음과 같다.
- 상태 전환이 명확한 경우
- 활성 상태와 전이 규칙을 더 직접적으로 표현하고 싶은 경우
- 동시 실행되는 task와 계층형 상태 구성이 중요한 경우
최근 Unreal 문서 흐름을 보면, State Tree는 단순 대체재라기보다 별도의 선택지에 가깝다.
Behavior Tree를 완전히 밀어내는 구조가 아니라, 상태 중심 AI를 더 명확하게 만들기 위한 다른 도구로 보는 편이 맞다.
'Unreal Engine' 카테고리의 다른 글
| GameplayMessageRouter Plugin 2 (1) | 2026.06.11 |
|---|---|
| GameplayMessageRouter Plugin 1 (0) | 2026.06.10 |
| Niagara (0) | 2026.05.20 |
| Delegate (0) | 2026.05.18 |
| Unreal Engine MCP (0) | 2026.04.21 |