В редакторе - время переходов настроено минимально, нет has exit time т.е. нечего править.
При беге проигрывалась анимация Run, при остановке Idle.
Если игрок бежал в одну сторону (жал стрелку ->) и потом останавливался - всё выглядело нормально.
А если игрок бежал в одну сторону, а потом в другую, т.е. резко менял направление (жал стрелку ->, а потом сразу <-), то возникал "глюк".
Между сменой стрелок есть время. Пусть 0.3 секунды. И в это время horizontalInput==0, а значит играет анимация Idle.
Итого это выглядело как бег, резкая остановка и 0.3 секунды скольжение т.к. играет анимация Idle, а объект "бежит" и через 0.3 ,бег в другую сторону.
Я решил сделать задержку вот так. Это нормально или есть ещё варианты?
Синтаксис:
Используется csharp
// Задержка нужна для отключения срабатывания анимации Idle при резкой смене направления бега.
public float horizontalInputDelay=0.04f;
public float horizontalInputCurrentDelay=0f;
void FixedUpdate()
{
//Расчет задержки для отпускания кнопки horizontalInput (горизонтальный ввод).
Debug.Log("horizontalInputCurrentDelay="+horizontalInputCurrentDelay);
if (horizontalInputCurrentDelay>0)horizontalInputCurrentDelay-=Time.fixedDeltaTime;
}
void Update()
{
//if (horizontalInput == 0) playerAnimations = PlayerAnimations.Idle; //Как было
if (horizontalInput == 0 && horizontalInputCurrentDelay<=0) playerAnimations = PlayerAnimations.Idle; // Как стало
// Мы можем менять направление на бегу. При смене, мы на секунду отпускаем клавишу и это приводит к мгновенному переходу к анимации Idle.
// Это создает некрасивый эффект при резкой смене направления. Поэтому мы должны сделать задержку отпускания кнопки.
if (horizontalInput != 0) {playerAnimations = PlayerAnimations.Run; horizontalInputCurrentDelay=horizontalInputDelay;}
}
public float horizontalInputDelay=0.04f;
public float horizontalInputCurrentDelay=0f;
void FixedUpdate()
{
//Расчет задержки для отпускания кнопки horizontalInput (горизонтальный ввод).
Debug.Log("horizontalInputCurrentDelay="+horizontalInputCurrentDelay);
if (horizontalInputCurrentDelay>0)horizontalInputCurrentDelay-=Time.fixedDeltaTime;
}
void Update()
{
//if (horizontalInput == 0) playerAnimations = PlayerAnimations.Idle; //Как было
if (horizontalInput == 0 && horizontalInputCurrentDelay<=0) playerAnimations = PlayerAnimations.Idle; // Как стало
// Мы можем менять направление на бегу. При смене, мы на секунду отпускаем клавишу и это приводит к мгновенному переходу к анимации Idle.
// Это создает некрасивый эффект при резкой смене направления. Поэтому мы должны сделать задержку отпускания кнопки.
if (horizontalInput != 0) {playerAnimations = PlayerAnimations.Run; horizontalInputCurrentDelay=horizontalInputDelay;}
}
PS
По идее можно было сделать промежуточные анимации - если horizontalInput==0, то на 0.4 сек игрок тормозит (нова анимация) и только потом Idle.
Но это долго, да и таких переходных анимаций будет куча - из бега в хотьбу и т.д.