Настройка анимационных контроллеров в движке игр
Animator Controller в Unity — не просто граф переходов. Для VR-персонажа с полным набором локомоции, интерактивных реакций и процедурных IK-слоёв это сложная машина состояний с несколькими слоями, Blend Tree, Sub-State Machine, Avatar Mask и синхронизированными параметрами. Если её не спроектировать правильно с самого начала — рефакторинг Controller при 30+ состояниях превращается в nightmare.
Почему «простой» граф ломается при масштабировании
Начинающие команды делают один Animator с десятками состояний и прямыми переходами между ними. Это работает для прототипа. При добавлении 10-го персонажа с похожей, но немного другой логикой — Controller дублируется и правится вручную. Баги расползаются.
Правильный подход — иерархия через Animator Override Controller. Base Controller содержит структуру: слои, параметры, все переходы. Для каждого конкретного NPC создаётся AnimatorOverrideController, который заменяет только Animation Clips, сохраняя всю логику. Это позволяет менять анимации NPC без касания графа переходов.
Sub-State Machines — обязательная практика для VR-NPC. Состояния разбиваются по логическим группам: Locomotion, Combat, Interaction, Dialogue. Переход между группами — простой, внутри группы — сложный с условиями. Это визуально читаемо и дебаггируется.
Слоевая архитектура для VR-персонажей
Для NPC в VR типовая структура Animator включает:
Layer 0: Base (Locomotion). Вес 1. Управляет нижней половиной тела: Blend Tree с параметрами Speed (float) и Direction (float). Четыре скорости — стоп, ходьба, бег — как минимум. Avatar Mask: только ноги и таз.
Layer 1: Upper Body. Вес 1, mode Additive или Override. Жесты, диалоговые анимации, реакции. Avatar Mask: торс и выше. Переходы триггерные — через SetTrigger("Gesture_Wave"). Exit Time = 0 на переходах из gesture → idle, чтобы не ждать конца анимации при прерывании.
Layer 2: IK Overrides. Вес 0–1 управляется кодом. Здесь TwoBoneIK Constraint для прицеливания рукой, Look At для взгляда. В VR особенно важно: NPC должен смотреть на игрока, отслеживая его через Animator.SetLookAtPosition() с lookAtWeight около 0.7 (не 1.0 — иначе шея выгибается как у совы).
Blend Tree vs. State Machine: когда что выбирать
Blend Tree подходит для непрерывных параметров: скорость ходьбы, направление стрейфа, наклон туловища. State Machine — для дискретных состояний: жив/мёртв, ранен/здоров, standing/crouching.
Ошибка: использовать State Machine для локомоции с условием Speed > 0.5 → Walk. При значении 0.49 персонаж резко переключается вместо плавного смешения. Blend Tree на том же параметре даёт правильный crossfade.
Переходы в State Machine для VR: Has Exit Time = false для реакций на события (не ждём конца текущей анимации), Transition Duration = 0.1–0.2 секунды стандартно, для combat-реакций = 0.05.
Отладка Controller в VR-проекте
Animator Debugger в Unity показывает текущие веса и параметры в Play Mode. Для VR важно запускать отладку через Editor с подключённой гарнитурой в Link-режиме — поведение Controller в headset может отличаться из-за Fixed Timestep и различного framerate. Используем Animator.logWarnings = true в dev-билдах.
Сроки: настройка базового Controller для одного персонажа — 1–3 рабочих дня; полная архитектура с Override Controllers и слоевой структурой для проекта с 5–10 NPC-типами — 1–2 недели. Стоимость рассчитывается индивидуально.





