Почти во всех 3D играх воспроизводится разная анимация ног в зависимости от направления движения. Т.е. если персонаж смотрит вперёд, но идёт назад - то будет воспроизводиться анимация ходьбы назад.
Один из самых простых способов реализовать это в Unity:
Данная функция готова для использования без MonoBehaviour.
Пояснения по коду
referenceVectorUp и referenceVectorRight - transform.up и transform.right объекта, от которого будет отталкиваться функция для поворота. Например, в данный момент мы разрабатываем Top Down Shooter, и в них передаются трансформы камеры.
movementVector - нажатия клавиш или левого стика геймпада. Значения от -1 до 1 по осям X и Y.
objectTransform - трансформ объекта персонажа.
В итоге в зависимости от поворота персонажа будут разные значения вектора.
Как использовать
Пример: есть 2D дерево смешивания. В нём есть две переменные: run и strafe, которые получают float от -1 до 1. И четыре анимации (но можно и больше, если есть отдельные анимации для бега по диагонали).
В нашем проекте это выглядит так:
Также можно вместо камеры можно передавать transform.forward игрока, чтобы корректировать анимации. Подойдёт для игр от третьего лица или ботов.
Один из самых простых способов реализовать это в 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.