Вращения могут сбивать с толку. Изучите их и узнайте, как вращать игровой объект в направлении движения в этом простом уроке.

Ресурсы
Учебник на Youtube: https://youtu.be/UJsaEVPntMg
Репозиторий Github: https://github.com/Jerga99/YT-Movement-Rotation-Unity
Полный курс: https://academy.eincode.com/courses/the-complete-unity-guide-3d-beginner-to-rpg-game-dev-in-c
Чего мы хотим достичь

Переместить игровой объект
Во-первых, начнем с функциональности движения.
void FixedUpdate()
{
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontalInput, 0, verticalInput).normalized;
if (movement == Vector3.zero)
{
return;
}
m_Rb.MovePosition(m_Rb.position + movement * speed * Time.fixedDeltaTime);
}
У меня есть запись в блоге и видео о движении, поэтому я не буду вдаваться в подробности. Мы хотим сосредоточиться на ротации.
Часть вращения
void FixedUpdate()
{
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontalInput, 0, verticalInput).normalized;
if (movement == Vector3.zero)
{
return;
}
Quaternion targetRotation = Quaternion.LookRotation(movement);
targetRotation = Quaternion.RotateTowards(
transform.rotation,
targetRotation,
360 * Time.fixedDeltaTime);
m_Rb.MovePosition(m_Rb.position + movement * speed * Time.fixedDeltaTime);
m_Rb.MoveRotation(targetRotation);
}
Начнем с targetRotation. Повороты обычно хранятся как тип Quaternion. Вы можете хранить их как Vector3, но вы будете чаще видеть кватернионы.
Кватернионы основаны на комплексных числах и состоят из 4 компонентов (x, y, z, w). Они не очень интуитивно понятны. Это не большая проблема, потому что вам никогда (редко) не нужно их модифицировать.
Что вам нужно знать, так это то, что они используются для вращений.
Однако, если вы хотите понять их, есть много ресурсов, которые могут вам помочь:
https://www.youtube.com/watch?v=zjMuIxRvygQ
https://www.youtube.com/watch?v=d4EgbgTm0Bg
Давайте поговорим подробнее о targetRotation.
Quaternion targetRotation = Quaternion.LookRotation(movement);
Для LookRotation мы предоставляем движение Vector3. Движение удерживает значение ввода игрока.
Если Движение имеет значение (1,0,0), объект движется вправо, если (0,0,1) — вперед и т. д.
Официальное описание LookRotation:
Создает вращение с указанными направлениями
forwardиupwards.
LookRotation ожидает получить 2 значения, вектор вперед и вектор вверх.
Мы предоставляем forward. Это наш вектор движения.
Мы также можем указать вектор вверх. В данном случае в этом нет необходимости, потому что значением по умолчанию восходящего вектора является Vector3.up, что равно (0,1,0).
Вот так выглядит вектор движения вперед и вверх относительно нашего игрового объекта.

Vector3.forward равен (0,0,1), а Vector3.up равен (0,1,0)
Давайте представим случай, когда игрок хочет двигаться, поэтому он смотрит вправо. В этом случае вектор движения будет (1,0,0)

Теперь давайте зададим вопрос: Сколько градусов должен вращаться игровой объект по оси Y, чтобы Vector3.forward совпадал с движением (1,0,0) ???
Ответ: Нам нужно повернуть Y точно на 90 градусов.

Вот так это выглядит в игре.

Это, по сути, вся функциональность поворота, которую мы хотели реализовать.
Вы можете заметить, что переход вращения происходит слишком быстро, практически сразу. Давайте сгладим это.
Повернуть в сторону
targetRotation = Quaternion.RotateTowards(
transform.rotation,
targetRotation,
360 * Time.fixedDeltaTime);
Мы собираемся переназначить targetRotation с результатом метода RotateTowards.
Формальное описание этого метода:
Поворачивает поворот от направления к.
Для этого метода нам нужно предоставить 3 значения,
- Ротация, в которой мы сейчас находимся, это transform.rotation.
- Ротация, к которой мы хотим перейти, это targetRotation
- максимальное количество градусов мы можем повернуть. Мы указываем, что можем повернуть максимум на 360 градусов за одну секунду. Отсюда 360 * Time.fixedDeltaTime
Это сгладит вращение. Вы можете попробовать это.
Подведение итогов
Вы только что узнали, как легко можно вращать игровой объект в направлении движения.
Не стесняйтесь проверить мое видео на YouTube, объясняющее эту тему: https://youtu.be/UJsaEVPntMg
Если вам интересно больше контента, посмотрите мой курс Unity:
https://academy.eincode.com/courses/the-complete-unity-guide-3d-beginner-to-rpg-game-dev-in-c