Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример использования 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.