Анимация и 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— isJumpingTrigger— одноразовый “выстрелить переход”, сбрасывается автоматически
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.
В следующей главе — звук, который не менее важен для ощущения мира.