Для чего используются слои анимации в аниматоре?
Что проверяют
Понимаете ли вы, как в Unity собрать сложное поведение персонажа без взрыва числа состояний в одном графе. Слои решают задачу «ноги бегут, руки стреляют». Следом обычно спрашивают, чем слои отличаются от Blend Tree и как менять вес слоя из кода.
Как отвечать
В Animator Controller каждый слой это отдельная машина состояний, которая работает параллельно с остальными. Слои применяются сверху вниз по списку: нижний в списке ложится поверх верхних. Настройки слоя:
- Weight: вклад слоя от 0 до 1. Базовый слой всегда работает с весом 1, а у нового слоя вес по умолчанию 0, и его нужно выставить;
- Blending:
Overrideзаменяет позу нижележащих слоёв,Additiveдобавляет к ней разницу, удобно для дыхания, отдачи, наклонов; - Avatar Mask: ограничивает слой частью тела. Для гуманоида отмечаются части тела, для Generic список трансформов. Типичный пример: слой верхней части тела со стрельбой поверх бега базового слоя;
- Sync: слой повторяет структуру другого слоя, но с другими клипами. Так делают раненую походку, не дублируя весь граф переходов;
- IK Pass: включает вызов
OnAnimatorIKдля слоя, там ставят руки на оружие или ноги на неровную поверхность.
Из кода слоем управляют через animator.GetLayerIndex("UpperBody") и animator.SetLayerWeight(index, weight). Вес обычно меняют плавно в Update, чтобы не было рывка. Состояние на конкретном слое запускают через animator.Play("Reload", index) или CrossFade.
Где спотыкаются
Путают слои с Blend Tree. Blend Tree смешивает клипы внутри одного состояния по параметру, например по скорости, а слои накладывают друг на друга независимые машины состояний.
Добавляют слой без маски в режиме Override с весом 1 и удивляются, что анимация рук полностью перебила бег.
Забывают, как считается Additive: Unity берёт разницу с первым кадром клипа или с опорной позой, заданной при импорте. Если клип на это не рассчитан, персонаж уезжает в странную позу, а ошибку начинают искать в коде.