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

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

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

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

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

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

Пример использования Blend Trees в Unity для плавного перехода анимаций движения

Blend Trees (или деревья смешивания) — это инструмент анимационного контроллера Unity, позволяющий плавно интерполировать между несколькими анимациями на основе одного или нескольких числовых параметров. Они идеально подходят для управления сложными состояниями, такими как движение персонажа с переменной скоростью и направлением.

Классический пример: движение персонажа в 2D

Рассмотрим типичный случай — изометрический или вид сверху, где персонаж может двигаться в восьми направлениях и иметь две скорости (ходьба и бег).

1. Настройка параметров и создание Blend Tree

В Animator Controller создаем новое состояние -> Create State -> From New Blend Tree. Называем его, например, "Movement". Дважды кликаем на состояние, чтобы войти в дерево.

В инспекторе настраиваем само дерево:

  • Blend Type: 2D Freeform Directional (так как движение зависит от направления и скорости).
  • Parameters: Два параметра — Speed (float) и Direction (float, угол в градусах от 0 до 360).
  • Automate Thresholds: Можно оставить включенным для равномерного распределения.

2. Добавление анимационных клипов в дерево

Добавляем Motion-поля (кнопка "+"). Для каждого направления (например, 8) добавляем по две анимации: Idle (или медленная ходьба) и быстрый бег. Пороговые значения (Threshold) для Speed будут автоматически распределены между 0 и 1. Позиции (Pos X, Pos Y) определяют направление. Например:

  • Анимация "Idle_Up": Pos X = 0, Pos Y = 1.
  • Анимация "Run_Up": Pos X = 0, Pos Y = 1 (та же позиция, но больший вес при высоком Speed).
  • Анимация "Run_Right": Pos X = 1, Pos Y = 0.
using UnityEngine;

public class CharacterMovement : MonoBehaviour
{
    private Animator animator;
    public float moveSpeed = 5f;
    public float runMultiplier = 2f;
    private float currentSpeed;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // Ввод с клавиатуры (WASD) или геймпада
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector2 inputDirection = new Vector2(horizontal, vertical);

        // Определяем, зажат ли Shift для бега
        bool isRunning = Input.GetKey(KeyCode.LeftShift);
        float targetSpeed = inputDirection.magnitude * (isRunning ? runMultiplier : 1f);

        // Плавная интерполяция скорости для избежания резких скачков
        currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, Time.deltaTime * 10f);
        animator.SetFloat("Speed", currentSpeed);

        if (inputDirection.magnitude > 0.1f) // Если есть ввод
        {
            // Преобразуем вектор направления в угол (в градусах)
            float angle = Mathf.Atan2(vertical, horizontal) * Mathf.Rad2Deg;
            // Корректируем угол под систему координат аниматора (например, 0 градусов = вперед)
            angle = (angle + 360f) % 360f;
            animator.SetFloat("Direction", angle);
        }
        else
        {
            // Если ввода нет, можно сбросить Direction или оставить последнее значение
            // Часто Direction сбрасывают, чтобы персонаж оставался повернутым в последнем направлении
        }
    }
}

3. Как это работает

  • Speed (0-1+): Определяет вес между анимациями "покоя" (Idle/Walk) и "бега" (Run) для текущего направления. При Speed = 0 воспроизводится чистая анимация покоя. При Speed = 0.5 будет смесь 50/50. При Speed = 1 — чистая анимация бега.
  • Direction (0-360): Определяет, между какими направлениями в 2D-пространстве будет происходить интерполяция. Например, если угол равен 45°, Unity автоматически рассчитает плавную смесь между анимациями для "Up" (0°) и "Right" (90°).

Преимущества подхода с Blend Tree:

  • Плавность: Исключаются резкие переключения между анимациями.
  • Эффективность: Одно анимационное состояние вместо десятков отдельных.
  • Гибкость: Легко добавить новые параметры (например, "усталость" для замедления) или анимации (присед, движение с оружием).
  • Простота контроля: Вся логика смешивания описывается двумя параметрами, которые легко вычислять в коде.

Таким образом, Blend Trees — это мощный и обязательный инструмент для создания отзывчивого и визуально приятного движения любого персонажа в Unity.