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 игрока, чтобы корректировать анимации. Подойдёт для игр от третьего лица или ботов.
It's time to kick gum and chew ass. And i'm all out of ass.
18.01.2023 11:Jan
Это Сишарп же? Ощущение, как будто в джаву посмотрел, но в какую-то «не такую»…
18.01.2023 13:Jan
Возможно похожие темы ...
Тема
Автор
/
Последний пост
Пользователи, просматривающие эту тему: 1 Гость(ей)