Мы занимаемся процедурной анимацией персонажей в Unity и Unreal Engine более 7 лет. За это время мы реализовали проекты для мобильных и PC-платформ, включая AAA-тайтлы. Ключевая анимация хороша для заранее известных движений, но персонаж, который поднимается по лестнице неизвестной высоты или дотягивается до предмета в произвольной точке, требует процедурного подхода. Смешение обоих методов — стандарт для современного геймплея.
Foot IK — самый распространённый кейс. На пандусе ступни персонажа «проваливаются» сквозь геометрию без процедурной коррекции. Мы исправляем это в реальном времени: raycast от голеностопа, корректировка позиции кости, Two Bone IK пересчитывает колено.
В Unity Animation Rigging это реализуется через Two Bone IK Constraint. Цепочка: Thigh → Shin → Foot. IK Target — пустой Transform, позиция которого управляется скриптом. Hint определяет направление изгиба колена. Без корректного Hint колено сгибается в случайную сторону.
Как настроить Foot IK для сложных поверхностей?
Логика скрипта: Physics.Raycast из позиции стопы (плюс offset вверх) вниз на LayerMask = Ground. При попадании — перемещаем IK Target к hit.point, вращаем по hit.normal для правильного угла постановки ноги. Weight ограничения — 0 в фазе swing (нога в воздухе), плавный lerp к 1 в фазе stance.
Проблема с Hip Offset: при постановке обеих ног на разную высоту (один склон) Hip-кость нужно опустить пропорционально. Рассчитывается через разницу высот двух IK Target и применяется как смещение к позиции Hip через animator.bodyPosition или Body Position Rig Constraint.
Почему Spring-кости нужно выносить из Animator?
Если Spring Bone кости включены в Animator State, они интерферируют с ключевой анимацией. Spring-кости должны быть вне Humanoid Avatar, только в Generic-иерархии под основным скелетом. В Unity это настраивается через отдельный Animator с Avatar Definition = Generic.
Procedural Look-At и прицеливание
Multi-Aim Constraint в Animation Rigging — голова и глаза следят за целью. Настройка: Source Object = цель, Aim Axis = Forward (Z для Unity). Constrained Axes — только Y и X, Z не трогать, иначе шея скрутится. Weight контролируется динамически: 0 в бою, 0.6–1.0 при исследовании.
Для прицеливания оружия: Two Bone IK на правую руку, IK Target следует за CrosshairTarget в мировом пространстве. Blend между ключевой анимацией прицеливания и процедурным IK — через Rig Layer Weight.
Ограничение: Animation Rigging работает в LateUpdate после Animator. Процедурные ограничения применяются поверх ключевой анимации каждый кадр. При сложной иерархии ограничений порядок слоёв в Rig критичен — нарушение даёт эффект «запаздывания» на один кадр.
Spring-системы для вторичного движения
Волосы, плащ, антенны — элементы, которые не анимируются вручную в продакшен-проекте с нормальным бюджетом. Варианты в Unity:
- Magica Cloth 2 — GPU-accelerated cloth simulation, поддерживает Wind Zone, коллайдеры, distance constraints. Настройка через компонент на меше с Skinned Mesh Renderer, Bone Cloth или Mesh Cloth.
- Dynamic Bone (legacy) — Spring-симуляция по цепочке костей. Параметры Stiffness, Elasticity, Damping настраиваются для каждой цепочки.
- VRM Spring Bone — стандарт для VRM-аватаров.
Для AAA-качества на PC — Physical Component из Houdini Rigging с экспортом в Unity, но это отдельный пайплайн.
Процедурная анимация в Unreal: сравнение с Unity
В Unreal Engine Control Rig с Full Body IK решает те же задачи. PBIK (Position-Based IK) в UE5 даёт полнотелесный IK из единого solver — в Unity аналога в стандартном пакете нет, только через Final IK. Unity Animation Rigging даёт на 20% меньше CPU overhead, чем Control Rig в UE5 на аналогичной задаче (согласно нашим тестам). Выбор платформы влияет на стек, но принципы одинаковы: слои анимации, IK поверх ключевых клипов, spring для вторичного движения.
Подробнее о логике скрипта Foot IK
void FixedUpdate() { RaycastHit hit; if (Physics.Raycast(foot.position + Vector3.up * 0.5f, Vector3.down, out hit, 1.5f, groundMask)) { target.position = hit.point; target.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); weight = Mathf.Lerp(weight, 1, Time.deltaTime * 10); } else { weight = Mathf.Lerp(weight, 0, Time.deltaTime * 10); } } void LateUpdate() { rig.weight = weight; } Типичные ошибки и их решения
| Ошибка | Последствие | Решение |
|---|---|---|
| IK без нормализованной цепочки костей | Синка не достигает позиции, нога застывает в extended position | Добавить offset вверх от поверхности или ограничить зону работы IK |
| Процедурная анимация без Physics Layer Separation | Spring-кости интерферируют с ключевой анимацией | Вынести Spring-кости в Generic-иерархию вне Humanoid Avatar |
| Update в FixedUpdate вместо LateUpdate | Animator перезаписывает изменения костей | Все применения к костям выполнять в LateUpdate |
Что входит в работу
- Настройка Foot IK, Look-At, Spring-систем для одного или нескольких персонажей
- Оптимизация под целевую платформу (CPU/GPU budget, FPS budget)
- Письменная документация по иерархии костей и настройкам ограничений
- Обучение команды (до 2 часов онлайн)
- Поддержка в течение 30 дней после сдачи
Сроки указаны в таблице ниже. Стоимость рассчитывается индивидуально после анализа существующего рига и требований к платформе. Мобильные платформы с ограничением на Physics — отдельное обсуждение.
| Задача | Ориентировочный срок |
|---|---|
| Foot IK для одного персонажа | от 1 до 2 дней |
| Full Body IK с Look-At и Foot IK | от 3 до 5 дней |
| Spring-система для вторичного движения | от 1 до 3 дней |
| Процедурная анимация взаимодействия с окружением | от 3 до 7 дней |
Свяжитесь с нами для консультации по настройке вашего рига. Закажите аудит текущего решения — мы найдём узкие места и предложим оптимизацию. Наш опыт подтверждён 15+ успешными проектами для мобильных и PC-платформ.
Официальная документация Unity Animation Rigging доступна на docs.unity3d.com. Также рекомендуем ознакомиться с Inverse kinematics на Wikipedia.






