2026-06-11 Unreal StateTree 학습 정리
부모 State의 Transition 공유
기존에는 Idle, Patrol 각각에 동일한 Transition을 작성하려고 했다.
Idle
├ EnemyDetected → Alert
└ CanAttack → Engage
Patrol
├ EnemyDetected → Alert
└ CanAttack → Engage이 방식은 로직이 변경될 때 여러 곳을 수정해야 한다.
StateTree에서는 부모 State에 Transition을 정의할 수 있다.
NonCombat
├ Idle
└ PatrolNonCombat
├ EnemyDetected → Alert
└ CanAttack → Engage이 경우 현재 활성 상태가 Idle이든 Patrol이든 부모 State의 Transition이 평가된다.
Transition 평가 순서
활성 경로가 다음과 같다고 가정한다.
Root
└ NonCombat
└ PatrolTransition은 일반적으로 다음 순서로 평가된다.
Patrol
↓
NonCombat
↓
Root즉 가장 구체적인 State의 Transition이 먼저 평가된다.
따라서 같은 조건을 자식과 부모에 동시에 두는 것은 지양하는 것이 좋다.
부모와 자식의 Task 실행
구조가 다음과 같을 때
NonCombat
└ Patrol처음에는 Patrol의 Task만 실행될 것이라고 생각했다.
하지만 실제로는 활성 경로에 포함된 State들의 Task가 함께 활성화될 수 있다.
NonCombat Task
Patrol Task따라서 부모와 자식의 역할을 명확히 분리하는 것이 중요하다.
예시
NonCombat
└ 공통 상태 관리
Patrol
└ 이동 수행Evaluator의 역할
Evaluator는 행동을 수행하는 객체가 아니다.
주요 역할은 상태 판단에 필요한 데이터를 계산하고 제공하는 것이다.
예시
DistanceToTarget
HealthPercent
CurrentTargetTransition은 Evaluator가 계산한 값을 사용한다.
DistanceToTarget < 500StateTree와 Behavior Tree 대응 관계
Behavior Tree 경험이 있다면 다음과 같이 이해할 수 있다.
| Behavior Tree | StateTree |
|---|---|
| Blackboard | Evaluator |
| Task | Task |
| Decorator | Transition |
State Type 정리
State
기본 상태
Idle
Patrol
AttackGroup
상태를 정리하기 위한 그룹
Combat
├ Attack
└ DodgeLinked State
State를 재사용하는 기능
Enemy
└ Death
Boss
└ Death하나의 Death State를 여러 곳에서 사용할 수 있다.
Linked Asset
다른 StateTree Asset을 참조하는 기능
GoblinTree
└ CommonCombatTree공통 AI 로직을 별도 Asset로 분리할 수 있다.
Sub Tree
하위 상태 머신
Combat
├ Attack
├ Dodge
└ Retreat하나의 State 내부에 또 다른 StateTree를 구성하는 개념이다.
랜덤 Transition 구현
Transition 여러 개를 생성한다고 랜덤 선택이 되지는 않는다.
Transition A
Condition = True
Transition B
Condition = True대부분 첫 번째 Transition이 우선 실행된다.
랜덤 분기를 원한다면 명시적으로 조건을 작성해야 한다.
Transition A
Random < 0.5
Transition B
조건 없음결과
50% → A
50% → BStateTree 구조 개선
기존 구조
Idle
Patrol각 State가 감지 로직을 직접 보유
개선 구조
NonCombat
├ Idle
└ Patrol공통 감지 로직
EnemyDetected
CanAttack을 부모 State에 집중
NonCombat
├ EnemyDetected → Alert
└ CanAttack → Engage오늘 얻은 교훈
공통 Transition은 여러 State에 복붙하지 말고 부모 State에 둔다.
Transition은 현재 활성 State부터 부모 방향으로 평가된다.
부모와 자식의 Task는 동시에 활성화될 수 있으므로 역할을 분리해야 한다.
상태 판단용 데이터는 Evaluator에 모으는 것이 좋다.
Linked State, Linked Asset, Sub Tree는 모두 재사용 목적이지만 활용 범위가 다르다.
랜덤 분기는 Transition 우선순위에 맡기지 말고 명시적으로 구현해야 한다.
Transition을 공유하려 하지 말고, Transition을 가진 부모 State를 설계하는 것이 더 유지보수하기 쉽다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.