Как сделать плавный переход между анимациями?

2D игра на Unity. Анимация выполнена с помощью Spine.
У моего персонажа 2 состояния - перемещение и ожидание. Соответственно есть 2 одноименных анимации.

Персонаж перемещается с помощью transform от точки A в точку B по прямой, потом останавливается и ждет.
Когда персонаж перемещается играет анимация перемещения. Когда ожидает - ожидания.
Напомню, что обычно все анимации зацикленные и пока персонаж идет, повторяется анимация перемещения.

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

Как эту проблему решают другие разработчики 2D игр. В 90% никак. Посмотрел несколько 2D игр средних по величине японских студий (про 3D не говорим, там вроде всё нормально).
Другие разработчики делают пиксельную анимацию, чиби анимацию, ноги - "палочки" с тремя состояниями, уменьшают шаг приближая положение ног к положению при ожидании или просто ничего не делают и игрок дергается, при переходе от бега к ожиданию.

Что я пробовал.
Смешивать анимации. Выглядит как подшаг. Т.е. нога сверху идет вниз к позиции ожидания. Но игрок уже ожидает, не перемещаясь. Подшаг на месте. Тоже не очень естественно.

Уменьшать скорость на последнем участке чтобы подшаг происходил при уменьшении скорости и воспринимался как окончание движения. Выглядит лучше, но долго подбирать расстояние/скорость/смешение анимаций.

Какие ещё есть варианты? Как сделать плавный переход между анимациями?

PS
Сложные варианты по типу расчета кадров анимации ходьбы в зависимости от пройденного расстояния, чтобы на нужном кадре перейти к промежуточной анимации (которых несколько) просьба не предлагать.
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
atmtab
@atmtab
Начинающий Frontend разработчик
using UnityEngine;

public class PlayerAnimation : MonoBehaviour
{
    private Animator animator;

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

    void Update()
    {
        if (/* условие перемещения */)
        {
            // Запуск анимации перемещения
            animator.CrossFadeInFixedTime("Перемещение", 0.1f);
        }
        else if (/* условие ожидания */)
        {
            // Запуск анимации ожидания
            animator.CrossFadeInFixedTime("Ожидание", 0.1f);
        }
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы