Skip to main content
Summary

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
 └ Patrol
NonCombat
 ├ EnemyDetected → Alert
 └ CanAttack → Engage

이 경우 현재 활성 상태가 Idle이든 Patrol이든 부모 State의 Transition이 평가된다.


Transition 평가 순서

활성 경로가 다음과 같다고 가정한다.

Root
└ NonCombat
   └ Patrol

Transition은 일반적으로 다음 순서로 평가된다.

Patrol
↓
NonCombat
↓
Root

즉 가장 구체적인 State의 Transition이 먼저 평가된다.

따라서 같은 조건을 자식과 부모에 동시에 두는 것은 지양하는 것이 좋다.


부모와 자식의 Task 실행

구조가 다음과 같을 때

NonCombat
 └ Patrol

처음에는 Patrol의 Task만 실행될 것이라고 생각했다.

하지만 실제로는 활성 경로에 포함된 State들의 Task가 함께 활성화될 수 있다.

NonCombat Task
Patrol Task

따라서 부모와 자식의 역할을 명확히 분리하는 것이 중요하다.

예시

NonCombat
 └ 공통 상태 관리

Patrol
 └ 이동 수행

Evaluator의 역할

Evaluator는 행동을 수행하는 객체가 아니다.

주요 역할은 상태 판단에 필요한 데이터를 계산하고 제공하는 것이다.

예시

DistanceToTarget
HealthPercent
CurrentTarget

Transition은 Evaluator가 계산한 값을 사용한다.

DistanceToTarget < 500

StateTree와 Behavior Tree 대응 관계

Behavior Tree 경험이 있다면 다음과 같이 이해할 수 있다.

Behavior TreeStateTree
BlackboardEvaluator
TaskTask
DecoratorTransition

State Type 정리

State

기본 상태

Idle
Patrol
Attack

Group

상태를 정리하기 위한 그룹

Combat
 ├ Attack
 └ Dodge

Linked 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% → B

StateTree 구조 개선

기존 구조

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를 설계하는 것이 더 유지보수하기 쉽다.

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기