Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример использования слоёв анимации в Unity
Слои анимации (Animation Layers) в Mecanim — это мощный инструмент, позволяющий накладывать несколько анимаций на один объект, управлять их приоритетом и смешиванием. Они идеально подходят для создания сложного поведения, например, когда персонаж одновременно идёт (базовый слой) и стреляет или машет рукой (дополнительные слои).
Основные принципы
Каждый слой имеет:
- Weight (Вес): определяет влияние анимации этого слоя на финальный результат (от 0 до 1).
- Blending (Смешивание): режим наложения — Override (перезаписывает нижележащие слои) или Additive (добавляет свои трансформации к ним).
- Mask (Маска): ограничивает влияние слоя определёнными частями скелета (например, только верхней половиной тела).
Практический пример: Персонаж, который идёт и машет
Представьте персонажа с Animator Controller, где есть состояния Idle и Walk. Мы хотим добавить анимацию воления рукой (Wave), которая будет работать независимо от того, стоит персонаж или идёт.
1. Структура проекта и настройка контроллера:
- Base Layer (слой 0): Управляет основной локомоцией. Состояния:
Idle,Walk. Переходы по параметруfloat Speed. - Wave Layer (слой 1): Добавляем новый слой. Назначаем ему Avatar Mask, который включает только правую руку и часть туловища. Устанавливаем Blending = Additive, Weight = 1.
2. Создание маски аватара:
В папке проекта создаём Avatar Mask (например, UpperBodyMask). В его инспекторе включаем (зелёные) кости: Spine, Right Shoulder, Right Arm, Right Hand. Остальные кости остаются выключенными (красные). Это ограничит влияние слоя только верхней частью тела.
3. Настройка слоя Wave в Animator Controller:
- Добавляем в слое
WaveсостояниеWaveHandс соответствующей анимацией. - Создаём пустое состояние
Emptyкак состояние по умолчанию для этого слоя. - Создаём переходы между
EmptyиWaveHandпо параметру типаboolс именемIsWaving.
4. Код для управления анимацией из скрипта:
Допустим, у нас есть простой скрипт PlayerController, который мы вешаем на персонажа.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Animator animator;
private float moveSpeed = 0f;
private bool isWaving = false;
void Start()
{
// Получаем компонент Animator
animator = GetComponent<Animator>();
}
void Update()
{
// Управление базовой локомоцией (слой 0)
float horizontalInput = Input.GetAxis("Horizontal");
moveSpeed = Mathf.Abs(horizontalInput);
animator.SetFloat("Speed", moveSpeed);
// Управление анимацией в слое Wave (слой 1)
// По нажатию клавиши 'E' включаем/выключаем waving
if (Input.GetKeyDown(KeyCode.E))
{
isWaving = !isWaving; // Инвертируем состояние
animator.SetBool("IsWaving", isWaving);
// ПРИМЕЧАНИЕ: Мы также можем управлять весом слоя динамически.
// Например, плавно включать waving:
// StartCoroutine(SetLayerWeightSmoothly(1, isWaving ? 1f : 0f, 0.3f));
}
// Важно: если персонаж начал махать во время ходьбы,
// анимация ходьбы (ноги) и махания (рука) будут воспроизводиться одновременно
// благодаря Additive blending и маске.
}
// Пример корутины для плавного изменения веса слоя
private System.Collections.IEnumerator SetLayerWeightSmoothly(int layerIndex, float targetWeight, float duration)
{
float startWeight = animator.GetLayerWeight(layerIndex);
float time = 0f;
while (time < duration)
{
animator.SetLayerWeight(layerIndex, Mathf.Lerp(startWeight, targetWeight, time / duration));
time += Time.deltaTime;
yield return null;
}
animator.SetLayerWeight(layerIndex, targetWeight);
}
}
Что происходит в рантайме?
- Когда
IsWaving = false, слойWaveнаходится в состоянииEmpty(не вносит изменений). - Когда игрок нажимает
EиIsWavingстановитсяtrue, слой переходит в состояниеWaveHand. - Анимация
WaveHand(Additive) добавляет движение руки к текущей позе, рассчитанной в Base Layer. - Avatar Mask гарантирует, что влиянию подвергнутся только выбранные кости. Ноги, продолжающие анимацию ходьбы, остаются нетронутыми.
- Если установить Blending = Override, то в состоянии
WaveHandанимация руки из базового слоя была бы полностью заменена, что могло бы привести к неестественной позе при ходьбе.
Распространённые сценарии использования слоёв:
- Добавление жестов и действий (как в примере выше) к базовой локомоции.
- Система ран и воздействий: отдельный слой с Override для анимации хромоты или боли, включаемый с высоким приоритетом при получении урона.
- Настройка взгляда/цели (LookAt): слой с Additive анимацией, поворачивающий голову и корпус к цели.
- Наложение эмоций (мимика, поза) поверх любой основной активности.
Таким образом, слои анимации — это фундамент для создания модульных, гибких и производительных систем анимации, позволяющих комбинировать простые поведения в сложные и правдоподобные движения. Ключ к мастерству — грамотное использование масок, режимов смешивания и динамического управления весом.