StateSwitcher
Namespace: Vortex.Unity.UI.StateSwitcher
Сборка: ru.vortex.unity.ui.misc
Назначение
Машина состояний для визуальных и поведенческих переключений. UIStateSwitcher управляет массивом именованных состояний, каждое из которых содержит набор StateItem.
Возможности:
- Переключение по индексу, имени или enum
- 7 готовых StateItem: GameObjects, Animator (bool/int), Colors (с анимацией), Sprites, Events, TweenerHub
StateSwitcherAttributeдля привязки к enum с визуализацией в Inspector- Событие
OnStateSwitchпри смене состояния - Защита от реентрантности
Вне ответственности:
- Анимации переходов между состояниями (используйте
TweenerHubSwitchилиColorsSwitch) - Логика выбора состояния (уровень 3/4)
Зависимости
| Зависимость | Назначение |
|---|---|
Vortex.Unity.UI.TweenerSystem |
TweenerHub — интеграция через TweenerHubSwitch |
Vortex.Unity.UI.TweenerSystem.UniTaskTweener |
AsyncTween — анимация цвета в ColorsSwitch |
Vortex.Unity.EditorTools |
DrawingUtility, ToolsSettings — рендеринг StateSwitcherDrawer |
Vortex.Unity.AppSystem.System.TimeSystem |
TimeController — покадровая задержка в GameObjectsSwitch |
Vortex.Core.ExtensibleEnumSystem |
ExtensibleEnum — перегрузка Set(ExtensibleEnum) по Order |
| Odin Inspector | [ValueDropdown], [ShowInInspector], [Button] |
Архитектура
StateSwitcher/
├── UIStateSwitcher.cs # Машина состояний (MonoBehaviour)
├── StateItem.cs # Абстрактная база поведения
├── Items/
│ ├── GameObjectsSwitch.cs # SetActive на массив GameObject
│ ├── AnimatorBoolSwitch.cs # SetBool на Animator
│ ├── AnimatorStateSwitch.cs # SetInteger на Animator
│ ├── ColorsSwitch.cs # Цвет (мгновенный или анимированный)
│ ├── SpritesSwitch.cs # Спрайт на SpriteRenderer/Image
│ ├── EventFire.cs # UnityEvent при активации
│ └── TweenerHubSwitch.cs # Forward/Back на TweenerHub
└── Handlers/
└── OnEnableStateRunner.cs # Переключение при OnEnable
UIStateSwitcher
MonoBehaviour с массивом StateData. Каждый StateData — именованное состояние с массивом StateItem[].
При переключении:
- Вызывает
DefaultState()на всех item'ах предыдущего состояния (узкое место!) - Вызывает
Set()на всех item'ах нового состояния - Запускает событие
OnStateSwitch
API
switcher.Set(0); // по индексу
switcher.Set("Active"); // по имени
switcher.Set(MyEnum.Active); // по enum
switcher.Set((byte)2); // по byte
switcher.Set(myExtensibleEnum); // по ExtensibleEnum (через Order, null → no-op)
switcher.ResetStates(); // сброс всех item'ов + начальное состояние
int current = switcher.State; // текущее состояние (-1 = нет)
StateData[] all = switcher.States; // массив всех состояний
switcher.OnStateSwitch += OnSwitch; // событие (StateData или null)
int index = switcher.GetState("name"); // индекс по имени (-1 = не найден)
| Поле Inspector | Тип | Описание |
|---|---|---|
states |
StateData[] |
Массив состояний |
stateOnEnable |
int |
Начальное состояние (dropdown) |
duplicateOnCreate |
bool |
Editor-only: при добавлении нового состояния клонировать item'ы из последнего |
StateItem
Абстрактный класс поведения. При активации состояния — Set(), при деактивации — DefaultState().
| Реализация | Что делает Set() | Что делает DefaultState() |
|---|---|---|
GameObjectsSwitch |
SetActive(true) на массив (опционально с задержкой на кадр через onDelayed) |
SetActive(false) (опционально с задержкой через offDelayed) |
AnimatorBoolSwitch |
SetBool(name, true) |
SetBool(name, false) |
AnimatorStateSwitch |
SetInteger(name, value) |
SetInteger(name, default) |
ColorsSwitch |
Установка цвета (мгновенно или через AsyncTween) |
Возврат к Color.white |
SpritesSwitch |
Установка спрайта | Установка null |
EventFire |
UnityEvent.Invoke() |
Ничего |
TweenerHubSwitch |
tweener.Forward() |
tweener.Back() |
ColorsSwitch
Поддерживает SpriteRenderer, Graphic (Image, Text), Outline. Режимы:
- Мгновенная смена цвета
- Анимированная через
AsyncTweenс настраиваемой длительностью и кривой - Опциональный стартовый цвет:
_useOwnStartColor = true— берёт текущий цвет с объекта,false— использует поле_startColor
Inspector-кнопка Get from... — захватывает текущий цвет с первого объекта.
StateSwitcherAttribute
Атрибут для привязки UIStateSwitcher к enum. Используется вместе с StateSwitcherDrawer.
[SerializeField, StateSwitcher(typeof(MyStatesEnum))]
private UIStateSwitcher switcher;
В Inspector отображает таблицу состояний:
- Индекс, описание (из
[Tooltip]/[LabelText]), имя из switcher - Подсветка активного состояния
- Клик для переключения
- Кнопка Sync — синхронизирует имена состояний с описаниями enum
OnEnableStateRunner
MonoBehaviour — переключает UIStateSwitcher в заданное состояние при OnEnable.
| Поле | Тип | Описание |
|---|---|---|
_stateSwitcher |
UIStateSwitcher |
Целевой switcher |
_stateToOpen |
int |
Индекс состояния |
Граничные случаи
| Ситуация | Поведение |
|---|---|
Set() с индексом вне диапазона |
LogError, состояние не меняется |
Set() с тем же индексом |
Пропуск (состояние не перезаписывается) |
Set() во время переключения |
Защита от реентрантности (_isSwitching guard) |
Set() до Awake |
Состояние сохраняется в _startState, применяется в Awake |
GetState("несуществующее") |
Возвращает -1 |
Set("несуществующее") |
LogError, затем откат к stateOnEnable — switcher не остаётся в неопределённом состоянии |
StateItem.Set() бросает исключение |
Перехват try/catch вокруг цикла foreach: LogError + LogException, остальные StateItem в этом состоянии не отрабатываются (быстрый откат, чтобы не маскировать настоящую проблему) |
ColorsSwitch с _smoothChange и нулевой _duration |
Мгновенная смена (AsyncTween с duration ≤ 0) |
Дублирующийся DropDownGroupName/DropDownItemName у StateItem-классов |
LogError, дубликат пропущен в dropdown |