18.01.2023 07:Jan
Почти во всех 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 игрока, чтобы корректировать анимации. Подойдёт для игр от третьего лица или ботов.