Поворот и вращение объектов в Unity

146 16-12-2024, 17:13

Каждый разработчик игр знает, что без вращения и поворотов игровых объектов невозможно сделать нормальную игру. И перед тем, как начать разбор поворота/вращения объекта, создадим игровой объект, и назовём его Player. Его мы и будем вращать.

Как поворот объекта, так и вращение, осуществляется путём изменения значений компонента Transform, и его свойства Transform.rotation.

И начнём данную статью с вращения, так как он более прост и понятен.

Вращение игрового объекта

Для начала разберём, что означает вращение? Вращение, это плавное изменение значений Transform.rotation, вокруг определённых осей. Вот их нам и нужно менять.

Для изменения этих значений, нам поможет метод Transform.Rotate. Работает он следующим образом:

void Update()
{
    transform.Rotate(0, 0, 1);
}

Этот скрипт будет вращать вашего персонажа по оси Z со скоростью 1. Вы так же можете выбрать другую ось вращения, например X или Y. Или же увеличить скорость вращения на 2.

void Update()
{
    transform.Rotate(2, 0, 0);
}

На этом всё! Как видите, вращать игровые объекты очень просто. Теперь перейдём к повороту, который по своей сути немного тяжелее.

Поворот игрового объекта

Поворот персонажа подразумевает его поворот на 180 градусов по одной из осей. Например, очень часто такое может понадобиться в 2д играх, преимущественно платформенного типа. Поэтому в качестве примера мы будем использовать 2д персонажа, которого нужно развернуть по горизонтали, то-есть по оси X.

Предыдущий код вращения нам не поможет, поскольку там мы вращали с помощью специального метода, который прибавляет к старым значениям - новые. Здесь же нам необходимо устанавливать конкретные значения.

Для того, чтобы это сделать, необходимо прописать следующий код:

Vector3 rotate = transform.eulerAngles;
rotate.y = 180;
transform.rotation = Quaternion.Euler(rotate);

Давайте разберём код:

  • В первой строке с помощью метода Transform.eulerAngles мы получаем значения roration в виде углов эйлера.
  • Во второй строке установили значение y в 180, тем самым развернули объект на 180 градусов.
  • В третьей строке, элеровские значения конвертируем в кватернионы, и сохраняем полученные данные.

Таким же образом мы можем вернуть объект в нормальное положение:

Vector3 rotate = transform.eulerAngles;
rotate.y = 0;
transform.rotation = Quaternion.Euler(rotate);

Аналогичным образом мы можем разворачивать наш объект по любой оси, изменив rotate.y на rotate.x или на rotate.z.

Полный код поворота объекта с проверкой нажатий клавиш будет следующим:

using UnityEngine;

public class rotatePlayer : MonoBehaviour
{
    void Update()
    {
        if (Input.GetAxis("Horizontal") > 0)
        {
            Vector3 rotate = transform.eulerAngles;
            rotate.y = 0;
            transform.rotation = Quaternion.Euler(rotate);
        }
        if (Input.GetAxis("Horizontal") < 0)
        {
            Vector3 rotate = transform.eulerAngles;
            rotate.y = 180;
            transform.rotation = Quaternion.Euler(rotate);
        }
    }
}

Как сделать чтобы поворот был не резким, а плавным? Используйте следующий метод:

.transform.Rotate(0,0,speedRotate*Time.deltaTime);

Обсудим?

!

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

    Чтобы оставлять сообщения - зарегистрируйтесь
    Открыть / закрыть чат

    Обратите внимание!


    Если у вас не отображаются материалы и какой либо интерфейс на сайте, пожалуйста, отключите блокировщики рекламы.