[C#] [Unity] Разная анимация ног в зависимости от направления движения
Почти во всех 3D играх воспроизводится разная анимация ног в зависимости от направления движения. Т.е. если персонаж смотрит вперёд, но идёт назад - то будет воспроизводиться анимация ходьбы назад.

Один из самых простых способов реализовать это в Unity:

Код:
public static Vector2 getAnimationDirection(Vector3 referenceVectorUp, Vector3 referenceVectorRight, Vector2 movementVector, Transform objectTransform)
{
    Vector2 animationFinalDirection = Vector2.zero;

    Vector3 dirForward = Vector3.Scale(referenceVectorUp, new Vector3(1f, 0f, 1f)).normalized;
    Vector3 animMoveDir = movementVector.y * dirForward + movementVector.x * referenceVectorRight;

    if (animMoveDir.magnitude > 1)
        animMoveDir.Normalize();

    Vector3 localMove = objectTransform.transform.InverseTransformDirection(animMoveDir);

    animationFinalDirection.x = localMove.x;
    animationFinalDirection.y = localMove.z;

    return animationFinalDirection;
}

Данная функция готова для использования без MonoBehaviour.

Пояснения по коду

referenceVectorUp и referenceVectorRight - transform.up и transform.right объекта, от которого будет отталкиваться функция для поворота. Например, в данный момент мы разрабатываем Top Down Shooter, и в них передаются трансформы камеры.

movementVector - нажатия клавиш или левого стика геймпада. Значения от -1 до 1 по осям X и Y.

objectTransform - трансформ объекта персонажа.

В итоге в зависимости от поворота персонажа будут разные значения вектора.

Как использовать

Пример: есть 2D дерево смешивания. В нём есть две переменные: run и strafe, которые получают float от -1 до 1. И четыре анимации (но можно и больше, если есть отдельные анимации для бега по диагонали).

В нашем проекте это выглядит так:
Код:
Vector2 animDir = getAnimationDirection(playerCamera.GetComponent<Transform>().up, playerCamera.GetComponent<Transform>().right, movementVector, transform)

animator.SetFloat("run", animDir.y);
animator.SetFloat("strafe", animDir.x);

Также можно вместо камеры можно передавать transform.forward игрока, чтобы корректировать анимации. Подойдёт для игр от третьего лица или ботов.
It's time to kick gum and chew ass. And i'm all out of ass.
Ответ
Это Сишарп же? Ощущение, как будто в джаву посмотрел, но в какую-то «не такую»…
Ответ
(18.01.2023 11:Jan)Zhbert Написал: Это Сишарп же?
Ну да, в заголовке указано.

А вообще сисярп вроде бы создавался под впечатлением от джавы, но могу ошибаться.
It's time to kick gum and chew ass. And i'm all out of ass.
Ответ
(18.01.2023 13:Jan)ozz Написал: в заголовке указано.

Ох блин. Старый стал, слепой...

(18.01.2023 13:Jan)ozz Написал: исярп вроде бы создавался под впечатлением от джавы, но могу ошибаться

Да, тоже что-то такое помню.
Ответ