/bin/dev - IT Lounge

Полная версия: [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 игрока, чтобы корректировать анимации. Подойдёт для игр от третьего лица или ботов.
Это Сишарп же? Ощущение, как будто в джаву посмотрел, но в какую-то «не такую»…
(18.01.2023 11:Jan)Zhbert Написал: [ -> ]Это Сишарп же?
Ну да, в заголовке указано.

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

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

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

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