Риггинг и анимация
Модель персонажа готова, выглядит отлично — и падает в Unity как деревянная кукла, потому что кости выставлены произвольно и не соответствуют требованиям Humanoid Avatar. Программист пытается использовать готовый Animator Controller из Asset Store, но блендинг анимаций ломает позу, потому что рут-мотион настроен неверно. Это типичная ситуация, когда риггинг и анимационный пайплайн не проектировались под движок с самого начала.
Риггинг — это не просто «добавить кости». Это проектирование системы управления, которая должна работать внутри конкретного движка с конкретными требованиями к формату данных.
Humanoid rig pipeline в Unity: в глубину
Unity работает с двумя типами рига: Generic и Humanoid. Выбор влияет на весь анимационный пайплайн.
Generic rig — произвольная иерархия костей. Анимации привязаны к конкретной модели, ретаргетинг невозможен. Подходит для неперсонажной анимации (техника, двери, существа с нестандартной анатомией).
Humanoid rig — Unity маппит кости на стандартную схему из 17 обязательных костей (позвоночник, голова, руки, ноги) и до 32 опциональных. После этого любая Humanoid-анимация применима к любому Humanoid-персонажу. Это основа для ретаргетинга и Animator Controller с Blend Tree.
Требования к скелету для Humanoid
Ошибки, которые ломают Avatar mapping:
- Неверная ориентация костей. Unity ожидает, что ось X направлена по кости в сторону дочерней кости. Если рука смотрит по Z или -Y — Avatar сгенерируется с искажённой T-pose.
- Лишние промежуточные кости в цепочке позвоночника. Если между Spine и Chest стоит промежуточная кость без маппинга — она теряется при ретаргетинге, анимация позвоночника выглядит деревянно.
- Roll-кости (twist bones) — кости для распределения скручивания предплечья и бедра. В Humanoid их нужно добавлять как дополнительные (не обязательные) кости и корректно настраивать веса. Без twist-костей предплечье при повороте кисти складывается некрасиво.
T-pose vs A-pose
Unity рекомендует T-pose как биндинговую. A-pose (руки опущены под ~45°) технически работает, но ретаргетированные анимации будут давать небольшие ошибки в плечевом суставе. Для персонажей с бронёй или широкими плечами A-pose иногда предпочтительнее — меньше растяжение меша при ретаргетинге. Решение принимается на этапе риггинга, переделать потом дорого.
Avatar Mask
Avatar Mask — инструмент для частичного применения анимаций. Например: нижняя часть тела играет анимацию бега, верхняя — анимацию стрельбы. Без Avatar Mask эти состояния конфликтуют.
Правильная структура Animator Controller для шутера:
Base Layer (Full Body weight: 1.0)
└── Locomotion Blend Tree (idle / walk / run / sprint)
Upper Body Layer (Avatar Mask: верхняя часть, weight: 1.0)
├── Idle_upper
├── Shoot
├── Reload
└── Aim_offset (2D Blend Tree по pitch/yaw)
Additive Layer (Avatar Mask: spine, weight: по параметру)
└── Lean_left / Lean_right
Additive layer для наклона — типичная оптимизация: вместо 8 отдельных анимаций (run_left, run_right, walk_left...) один additive lean применяется поверх любого состояния.
Blend Tree для локомоции: практический разбор
Blend Tree — система смешения анимаций по одному или двум параметрам. Для локомоции персонажа стандарт — 2D Freeform Directional с параметрами velocityX и velocityZ.
Минимальный набор клипов для базовой локомоции:
| Анимация | velocityX | velocityZ |
|---|---|---|
| Idle | 0 | 0 |
| Walk Forward | 0 | 0.5 |
| Run Forward | 0 | 1.0 |
| Walk Backward | 0 | -0.5 |
| Run Backward | 0 | -1.0 |
| Strafe Left | -0.5 | 0 |
| Strafe Right | 0.5 | 0 |
Freeform Directional интерполирует между клипами по углу и магнитуде вектора скорости. При velocity (0.35, 0.35) смешиваются Walk Forward и Strafe Right с весами, вычисленными по расстоянию до каждой точки в 2D-пространстве.
Root Motion vs. In-Place анимации:
-
Root Motion — движение персонажа управляется смещением рут-кости в анимационном клипе. Аниматор «вшивает» скорость движения в анимацию. Unity читает это смещение и двигает Transform персонажа. Плюс: анимация и движение всегда синхронизированы (шаги совпадают с перемещением). Минус: сложнее управлять скоростью через код, требует корректной настройки в Animator (
Apply Root Motion: true). - In-Place — кость таза остаётся на месте, перемещение управляется кодом (CharacterController или Rigidbody). Проще интегрировать в физическую систему, но риск рассинхронизации шагов со скоростью движения (slipping feet).
Для большинства action-игр используется In-Place + Foot IK через Animation Rigging пакет (Unity) для корректной постановки стоп на неровную поверхность.
Skinning: веса и проблемные зоны
Скиннинг (привязка меша к костям через веса) — наиболее трудоёмкий этап риггинга органических персонажей.
Инструменты:
- Maya — Weight Paint tool + Component Editor для точной ручной правки. Функция Smooth Skin Weights как стартовая точка, потом ручная доводка проблемных зон.
- Blender — Weight Paint mode + Automatic Weights как базис. Vertex Group Editor для точечной правки.
- 3ds Max — Skin modifier + Weight Table.
Проблемные зоны и решения:
Подмышки: стандартное скиннинг-решение — «конфетный обёрточный» артефакт при подъёме руки. Решается добавлением corrective shape keys (blend shapes), которые срабатывают при определённом угле плечевого сустава. В Maya — Pose Space Deformation (PSD), в Unity — BlendShape с AnimationClip, который управляет весом через IK angle.
Колени и локти: нужны строго перпендикулярные кольца эджлупов (это требование к топологии, которое закладывается ещё при ретопологии). Twist-кости распределяют деформацию на три сустава (shoulder twist, elbow, forearm twist), что устраняет «скручивание цилиндра».
Боевые анимации и состояния
Боевая анимационная система — это не просто набор клипов. Это граф состояний с транзишн-условиями и interrupt priorities.
Типичная ошибка: транзишн из Idle → Attack с Has Exit Time: true и Exit Time: 0.9. Это означает, что атака начнётся только когда idle отыграет 90%. Игрок нажал кнопку атаки и ждёт 0.5 секунды. Решение: Has Exit Time: false, транзишн по trigger, Interruption Source: Current State с приоритетом.
Структура боевых состояний:
Any State → Hit Reaction (trigger: onHit, interrupts current)
Any State → Death (trigger: onDeath, interrupts all)
Attack Layer:
Idle → Attack1 (trigger: attack)
Attack1 → Attack2 (trigger: attack, exit time: 0.6) // combo window
Attack2 → Attack3 (trigger: attack, exit time: 0.6)
Attack1/2/3 → Idle (no trigger, exit time: 1.0)
Combo-window открывается на ~40% длины анимации и закрывается на ~80%. Это создаёт ощущение responsiveness без разрушения анимации.
Spine 2D для мобильных игр
Spine — стандарт для 2D-анимации в mobile RPG, idle games, action-platformers. Меш персонажа разбивается на части, привязанные к 2D-скелету. Анимация — трансформации костей, mesh deformation через weighted vertices.
Преимущества перед frame-by-frame:
- Файл анимации весит килобайты вместо мегабайт (спрайтлисты).
- Ретаргетинг: одни анимации атаки работают на разных персонажах с идентичной скелетной структурой.
- Смешение анимаций и IK — те же концепции, что в 3D.
Интеграция в Unity: официальный Spine Runtime для Unity. Компонент SkeletonAnimation управляет воспроизведением, SkeletonMecanim позволяет использовать Animator Controller поверх Spine-скелета. Для программной анимации — прямое управление через API: skeletonAnimation.AnimationState.SetAnimation(0, "walk", true).
DOTween часто используется в связке со Spine для управления не-скелетными анимациями UI-элементов, привязанных к персонажу (health bar, damage numbers) — не для самого скелета, а для синхронизации UI с игровыми событиями.
Что мы делаем в рамках услуги
- Риггинг персонажей под Unity Humanoid / Generic Avatar с поддержкой ретаргетинга.
- Skinning с ручной доводкой весов в проблемных зонах, twist-кости, corrective shapes.
- Разработка Animator Controller: Blend Tree для локомоции, Avatar Mask для многослойных систем, боевые граф состояний.
- Создание анимационных клипов: локомоция, боевые действия, реакции, синематики.
- Spine 2D риггинг и анимация для мобильных проектов, интеграция в Unity.
- Настройка Root Motion и Foot IK через Animation Rigging.





