← Назад к вопросам

Приведи пример использования слоёв анимации

2.3 Middle🔥 161 комментариев
#Анимация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример использования слоёв анимации в 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 анимацией, поворачивающий голову и корпус к цели.
  • Наложение эмоций (мимика, поза) поверх любой основной активности.

Таким образом, слои анимации — это фундамент для создания модульных, гибких и производительных систем анимации, позволяющих комбинировать простые поведения в сложные и правдоподобные движения. Ключ к мастерству — грамотное использование масок, режимов смешивания и динамического управления весом.

Приведи пример использования слоёв анимации | PrepBro