~3 мин чтения

Анимация и Animator Controller

Animation clips, state machine, blend trees — как персонаж не выглядит куклой.

В Unity анимация — не просто движение Transform. Это система Mecanim: Animation Clip + Animator Controller (state machine) + параметры + переходы.

Animation Clip

Clip — это .anim файл с записанными значениями свойств по времени. Источники клипов:

  • Импортированные из FBX — анимации, сделанные в Blender/Maya/Motion Capture.
  • Записанные в редакторе через Animation window (Window → Animation → Animation).
  • Купленные из Asset Store (Mixamo и т.п.).

Каждая дорожка clip’а — путь к свойству относительно корня (например, Hips/Spine/Head -> rotation) и набор keyframes. Unity интерполирует между ключами.

Animator Controller

Это state machine: вершины — состояния (clip’ы или sub-state machines), рёбра — переходы с условиями. Условия — параметры контроллера:

  • Float — скорость
  • Int — комбо-номер
  • Bool — isJumping
  • Trigger — одноразовый “выстрелить переход”, сбрасывается автоматически
        Idle  ───── Speed > 0.1 ────►  Run
          ▲                            │
          │ Speed < 0.1                │
          └────────────────────────────┘

       Любое состояние ── isJumping=true ──► Jump

                                              ▼ on Land trigger
                                            (возврат в Idle)

Any State — спецвершина, которая переходит куда угодно при выполнении условия. Удобно для “получил урон → реакция”, но осторожно: переход срабатывает и на саму себя, если не отключить “Can Transition To Self”.

public class PlayerAnim : MonoBehaviour
{
    private Animator _animator;

    private void Awake() => _animator = GetComponent<Animator>();

    public void OnMove(float speed) {
        _animator.SetFloat("Speed", speed);
    }

    public void OnJump() {
        _animator.SetTrigger("Jump");
    }
}
Хешируйте имена параметров

Строковый поиск параметров в SetFloat("Speed", ...) дороже, чем через хеш: _animator.SetFloat(Animator.StringToHash("Speed"), ...). Кэшируйте хеши в статических полях.

Blend Tree

Часто нужна не “одна анимация → другая”, а плавный переход между похожими. Например, ходьба ↔ бег ↔ стояние. Это Blend Tree: внутри состояния клипы смешиваются по параметру.

1D Blend Tree: один float (скорость), смешивает Idle (0), Walk (2), Run (6). 2D Blend Tree: два float (например, InputX + InputY), смешивает 8 направлений ходьбы.

Это и есть стандартный приём для locomotion в шутерах и экшенах.

Root Motion

По умолчанию Animator меняет позы скелета, но не двигает корень GameObject. Если в клипе анимация “шаг вперёд” — игрок останется на месте, ноги “будут шагать”.

Root Motion включает использование смещения корневой кости как реального движения GameObject. Полезно для cinematic-анимаций (драка с захватом, добивание), где движение точно соответствует анимации.

Когда не использовать: классический шутер, где скорость определяется кодом и логикой. Тогда Root Motion отключают, а Animator только показывает анимацию.

Avatar и humanoid retargeting

Unity различает Generic и Humanoid скелеты. Humanoid Avatar — стандартизированная карта костей (hips, spine, chest, head, плечи/руки/кисти, ноги/стопы — и опциональные кости пальцев), куда мапятся реальные кости вашего скелета. Это даёт retargeting: анимация, записанная для одного скелета, идёт и на другом — у NPC и игрока разные модели, одна библиотека анимаций.

При импорте FBX выберите Rig → Animation Type → Humanoid, дальше “Configure Avatar” — там Unity автоматически назначит кости, проверьте и сохраните.

Animation Events

В Animation Window есть таймлайн с событиями — можно вызывать методы вашего C#-кода в конкретный кадр клипа. Классический пример — звук шага именно когда стопа касается земли:

// Метод должен быть на компоненте того же GameObject (или его детей)
public void FootStep_AnimEvent() {
    AudioSource.PlayClipAtPoint(_footstepClip, transform.position);
}

В импорте клипа можно добавить event на нужный кадр и указать имя метода. Подписей — только один параметр (float/int/string/object).

Animation Rigging — процедурная анимация

Пакет Animation Rigging позволяет накладывать процедурные constraint’ы поверх Animator’а:

  • TwoBoneIK — наклонить руку, чтобы кисть достала до точки.
  • Aim Constraint — повернуть голову или оружие к цели.
  • Multi-Parent Constraint — рука держится за дверь, когда персонаж её открывает.

Это спасает в ситуациях, когда чистой клип-анимации недостаточно, а полноценный IK-солвер писать не хочется.

Animator vs Animation: что это вообще

Есть два компонента, и они исторически путаются:

  • Animator — современный, с state machine. Используется в 99% новых проектов.
  • Animation — старый (legacy), без state machine. Простой API animation.Play("clip"). Не использовать в новом коде.

В новом проекте — только Animator.

В следующей главе — звук, который не менее важен для ощущения мира.