Что это: модуль автомата состояний с двумя режимами работы: code-first через StateMachine<TState> и inspector/no-code через StateMachineData + StateMachineBehaviourBase. Скрипты находятся в Scripts/StateMachine/.
Навигация: ← К Docs · обзор ниже
- Нужен чистый кодовый автомат с типизированными состояниями:
StateMachine<TState>иStateMachineBehaviour<TState>. - Нужна настройка через инспектор и
ScriptableObject:StateMachineBehaviourBaseиStateMachineData. - Нужны условия переходов без жёстких ссылок на объекты сцены:
ConditionEntryPredicateи контекстные слоты вStateMachineEvaluationContext.
| Часть | Назначение |
|---|---|
IState |
Базовый жизненный цикл состояния: OnEnter, OnUpdate, OnExit, опционально OnFixedUpdate, OnLateUpdate. |
StateMachine<TState> |
Ядро автомата: смена состояния, регистрация переходов, кэширование, события. |
StateTransition |
Описание перехода между состояниями с приоритетом и списком предикатов. |
StatePredicate |
Базовый тип условий перехода; есть bool/int/float/string/composite и др. |
StateMachineBehaviour<TState> |
Generic MonoBehaviour-обёртка над кодовым автоматом. |
StateMachineBehaviourBase |
Inspector-friendly runtime-компонент для StateMachineData. |
StateData |
Описание одного no-code состояния через ScriptableObject. |
StateMachineData |
Конфигурация состояний, переходов и начального состояния. |
- Реализовать
IState. - Создать
StateMachine<TState>или наследникStateMachineBehaviour<TState>. - Зарегистрировать
StateTransition. - Вызывать
EvaluateTransitions()вручную или включить автоматическую оценку в behaviour-обёртке.
- Создать
StateDataиStateMachineData. - Добавить на сцену
StateMachineBehaviourBase. - Назначить
StateMachineData. - Заполнить
Context for conditions, если условиям нужны объекты сцены. - Использовать inspector events и runtime-кнопки компонента.
StateMachineBehaviour<TState>иStateMachineBehaviourBaseне равнозначны по API.- Generic-версия удобна для кода, но не даёт inspector-события и runtime-поля из
Base. StateMachineDataне хранит прямые ссылки на scene object; для этого используются context slots.- Кэширование состояний и переходов встроено в ядро и включено по умолчанию.
- StateMachine — API кодового ядра.
- StateMachineBehaviour — generic
MonoBehaviour-обёртка. - StateMachineBehaviourBase — inspector/no-code компонент.
- NoCode_StateMachine_Usage — настройка
StateMachineDataи условий.
stateMachine.OnStateChanged.AddListener((from, to) =>
{
Debug.Log($"State changed: {from?.GetType().Name} -> {to?.GetType().Name}");
});Кастомный редактор для StateMachineData, StateData и StateMachineBehaviourBase предоставляет:
- Улучшенный no-code workflow для состояний/переходов
- Меню добавления полиморфных
StateActionиStatePredicate - Runtime controls и runtime-информацию о состоянии
- Секции UnityEvents для интеграции без кода
public class IdleState : IState
{
public void OnEnter() { }
public void OnUpdate() { }
public void OnExit() { }
public void OnFixedUpdate() { }
public void OnLateUpdate() { }
}
public class RunningState : IState
{
public void OnEnter() { }
public void OnUpdate() { }
public void OnExit() { }
public void OnFixedUpdate() { }
public void OnLateUpdate() { }
}
public class PlayerStateMachine : StateMachineBehaviour<IState>
{
private void Start()
{
ChangeState<IdleState>();
// Регистрация перехода
var transition = new StateTransition
{
FromStateType = typeof(IdleState),
ToStateType = typeof(RunningState)
};
transition.AddPredicate(new BoolPredicate { Value = Input.GetKey(KeyCode.Space) });
RegisterTransition(transition);
}
}- Создать
StateMachineDataчерез меню - Создать несколько
StateDataдля состояний - Настроить переходы в инспекторе
- Присвоить
StateMachineDataвStateMachineBehaviour - State Machine автоматически загрузится при старте
- Используйте кэширование - по умолчанию включено, не отключайте без необходимости
- Группируйте переходы - используйте приоритеты для управления порядком проверки
- Комбинируйте предикаты - используйте AndPredicate/OrPredicate для сложных условий
- Валидируйте конфигурацию - используйте
StateMachineData.Validate()перед использованием - Используйте события - подписывайтесь на события для отслеживания изменений состояний
- Кэширование состояний уменьшает аллокации
- Кэширование переходов ускоряет поиск доступных переходов
- Автоматическая оценка переходов может быть отключена через
autoEvaluateTransitions = false - Используйте приоритеты переходов для оптимизации проверки условий
- NoCode состояния не поддерживают
OnFixedUpdateиOnLateUpdateпо умолчанию - Переходы по именам (NoCode) требуют наличия
StateMachineData
Текущая версия: 1.0.0
- StateMachine - Документация по основному классу StateMachine
- StateMachineBehaviour - Документация по MonoBehaviour компоненту
- StateMachineBehaviourBase - Документация по no-code компоненту
- NoCode_StateMachine_Usage - Пошаговая настройка без кода
Для более подробной информации смотрите XML документацию в исходном коде.
- Unity 2021.3 LTS или выше
- ✅ Удален старый GraphView редактор
- ✅ Упрощенная архитектура - только ScriptableObject и код
- ✅ Улучшенный кастомный редактор Inspector
- ✅ Обновлена документация
- Базовая функциональность State Machine
- NoCode конфигурация через ScriptableObject
- Граф редактор на основе GraphView (устарел)