Создание анимаций взаимодействия с предметами в играх
Персонаж тянется к двери, рукоятка находится ровно там, где должна быть — но рука проходит сквозь неё, потому что дверь расположена на 15 сантиметров левее, чем в оригинальном анимационном файле. Или персонаж поднимает предмет — и тот телепортируется в руку вместо плавного захвата. Это не баги рига, это архитектурная проблема: анимации взаимодействия требуют согласования позиций объекта и персонажа в реальном времени, и реализовать это без IK и правильной attachment системы не получится.
Почему hardcoded interaction анимации не работают в реальных проектах
Запечь полное взаимодействие в один FBX-клип — соблазнительно просто. Аниматор в Maya создаёт рендер персонажа с кружкой, экспортирует, импортирует в Unity. В сцене это выглядит правильно ровно один раз: когда персонаж стоит точно в той же позиции, что и в исходном файле.
В игре персонаж может подойти к предмету с любой стороны, объект может лежать на разной высоте, могут быть physics-симулированные предметы, которые не находятся в предсказуемой позиции. Полная запечённая анимация ломается немедленно.
Решение — разделить анимацию на две части. Base animation задаёт общий arc движения тела, anticipation позу и follow-through. IK layer подтягивает конечность к реальной позиции объекта в runtime. Unity Animation Rigging package предоставляет для этого Chain IK Constraint и Two Bone IK Constraint с Tip и Target transform'ами, которые управляются скриптом, получающим позицию интерактивного объекта.
Вес IK constraint не должен быть постоянным 1.0. Правильная схема: в начале анимации (approach фаза) weight = 0, тело двигается по base clip. По мере приближения руки к объекту weight интерполируется к 1.0 через AnimationCurve, которую контроллер обновляет через constraint.weight = ikWeightCurve.Evaluate(normalizedAnimationTime). Это создаёт ощущение того, что персонаж «нащупывает» предмет, а не скачет к нему по прямой.
Attachment и parent constraints
Когда персонаж берёт предмет в руку, объект должен стать дочерним для bone или для специального attach point. В Unity самый надёжный способ — GameObject с Transform, прикреплённый к кости руки (grip_r / grip_l), к которому объект Attach'ится через transform.SetParent() в момент Animation Event.
Animation Event ставится на конкретный кадр анимации — тот момент, когда хват уже закрылся. Если поставить раньше, предмет прыгнет в руку до закрытия хвата. Если позже — будет кадр, когда рука уже закрыта, а предмет ещё лежит на земле.
Для точности хвата используется Attachment Offset: предмет имеет пустой GameObject с именем типа grip_socket, и при attachment его локальный transform выравнивается по grip_r attach point'у персонажа через targetObject.transform.position = gripPoint.position + offset. Offset вычисляется заранее в Editor и сохраняется в ScriptableObject для каждого типа предметов.
Вариативность через Constraint blending
Если в игре несколько типов одного взаимодействия (поднять лёгкий предмет, поднять тяжёлый ящик, поднять раненого союзника) — не нужно делать полностью отдельные анимации. Достаточно сделать базовую анимацию + additive слой для тяжёлого объекта (пригибание корпуса, напряжение рук). Additive weight при этом управляется через ItemWeight параметр, который Animator Controller получает из ItemData ScriptableObject.
Override Animator Controller с AnimatorOverrideController — полезен, когда разные предметы требуют разные клипы для одного и того же state. Например: Interact_UseItem state в базовом контроллере может быть перегружен для конкретного предмета через override без изменения всей Animator Controller логики.
Процесс создания
Начало — референс-видео или покадровый breakdown взаимодействия. Для pick-up анимаций это особенно важно: реальный человек никогда не берёт предмет прямолинейным движением — есть arc, есть anticipation пальцев, есть сдвиг веса.
Производство: блокинг base animation без IK → расстановка attach/detach Animation Events → настройка IK constraints в Unity → тест с реальной геометрией сцены → финальный polish вторичных движений.
| Тип взаимодействия | Срок |
|---|---|
| Pick-up / put-down один предмет | 2–4 дня |
| Door open/close с IK настройкой | 3–5 дней |
| Полный interaction set (5–10 типов) | 2–3 недели |
| Сложные двуручные взаимодействия (оружие, механизмы) | 3–5 дней на тип |
Стоимость рассчитывается индивидуально. Для точной оценки нужны: список типов взаимодействий, скриншоты или видео геймплея, описание существующей систем IK и Animator Controller структуры.





