Как сделать поворотники в юнити

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Приветствую всех друзья! В прошлой статье мы подробно рассмотрели предназначение слоев в Unity. Сегодня мы поговорим о представлении вращения и ориентации в пространстве игровых объектов. Это важная информация особенно для новичков - очень многие путаются на начальных этапах именно во вращении игровых объектов.

Вращения в 3D приложениях обычно представляют одним из двух путей: кватернионы ( Quaternions ) или углы Эйлера ( Euler angles ). У каждого из них есть свои преимущества и недостатки. Unity под капотом использует для представления вращений кватернионы, но в инспекторе для удобства показаны значения углов Эйлера, это делает изменение значений в инспекторе более простым и легким для понимания.

Углы Эйлера.

Углы Эйлера представлены тремя значениями углов для осей X, Y и Z которые применяются последовательно. Чтобы применить вращение Эйлера к конкретному игровому объекту Каждое значение вращения применяется поочередно, как вращение вокруг своей соответствующей оси.

У углов Эйлера есть следующие преимущества:

- Они могут представлять собой поворот от одной ориентации к другой через поворот более чем на 180 градусов

Но без недостатков как вы понимаете такой способ представления вращения также не обошелся:

Кватернионы.

Кватернионы могут использоваться для представления ориентации или вращения игровых объектов. Это представление внутри состоит из четырех чисел (в рамках Unity это X, Y, Z и W ) однако эти числа не представляют собой углы или оси, и обычно вам никогда не нужно обращаться к ним напрямую. Если вы не особо заинтересованы в изучении математики кватернионов, то вам действительно нужно знать только одно, что кватернион представляет собой вращение в трехмерном пространстве, и вам никогда нет нужды знать или изменять свойства X, Y, и Z напрямую.

К его сильным сторонам можно отнести:

К слабым можно отнести следующее:

- Один кватернион не может представлять вращение, превышающее 180 градусов в любом направлении.

- Числовое представление кватерниона не является интуитивно понятным.

Unity хранит вращения всех игровых объектов как кватернионы, так как его достоинства перевешивают недостатки.

Компонент Transform отображает в инспекторе вращения с использованием углов Эйлера, поскольку это легче понять и отредактировать. Unity преобразует новые значения в инспекторе для вращения игрового объекта в новые значения вращения кватерниона.

Существует небольшой побочный эффект от таких преобразований, скажем мы ввели в окне инспектора следующие цифры для Rotation X: 0 Y: 375: Z: 0 . Это значение невозможно представить в виде кватерниона, поэтому при запуске игры в инспекторе значения вращения игрового объекта изменятся на X: 0 Y: 15: Z: 0 . Это происходит потому, что Unity преобразует вращение в кватернион, который не имеет понятия полного вращения на 360 градусов плюс 5 градусов, вместо этого он настроен на ориентацию таким же образом, как и результат вращения.

Последствия для написания скриптов.

При работе с обработкой вращений в ваших скриптах, вы должны пользоваться классом Quaternion (о нем еще будет отдельная статья) и его функциями для создания и изменения вращательных значений. Есть некоторые ситуации, когда допустимо использовать углы Эйлера, но вы должны иметь в виду – нужно использовать функции класса Quaternion , которые имеют дела с углами Эйлера. Извлечение, изменение и повторное применение значений углов Эйлера из свойства Rotation компонента Transform может вызвать непреднамеренные побочные эффекты.

Последствия для создания анимации.

Многие программы создания трехмерной графики, а также сам Unity с его окном анимации позволяют использовать углы Эйлера для задания поворотов во время анимации.

Эти значения вращений часто могут превышать диапазоны, выражаемые кватернионами. Например, если игровой объект вращается на 720 градусов, это может быть представлено углами Эйлера как X: 720 Y: 0 Z: 0 . Но это невозможно представить с помощью значения кватерниона.

В собственном окне анимации (о котором еще будет статья) есть опции, которые позволяют указать, как вращение должно быть интерполировано – с помощью интерполяции кватерниона или углов Эйлера. Задавая интерполяцию Эйлера, вы сообщаете Unity, что хотите получить полный диапазон движения, заданный углами. Однако при вращении кватерниона вы говорите, что просто хотите, чтобы вращение закончилось в определенной ориентации, и Unity использует интерполяцию кватерниона и вращается на кратчайшее расстояние, чтобы добраться туда.

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

Также есть некоторые ситуации, когда даже при повторной дискретизации – кватернионное представление импортированной анимации не может соответствовать оригиналу достаточно близко, по этой причине в Unity 5.3 и выше есть возможность отключить повторную дискретизацию анимации, так что вы можете вместо этого использовать исходные ключевые кадры анимации Эйлера во время выполнения.

Выделенный пункт позволяет переключаться между дискретизацией в кватернионы или оставить все в формате Эйлера

Выделенный пункт позволяет переключаться между дискретизацией в кватернионы или оставить все в формате Эйлера

На сегодня это все. В следующей статье мы обзорно пройдемся по источникам освещения и камерам в Unity. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!

Андрей Полковенков


Андрей Полковенков

Окей, lookat это хрень ибо я хз как сделать через нее плавный поворот. А вот с lerp я не понял как повернуть объект к другому объекту. Я пытался через looktowards, но там поворот только по x и y. При функции target.transform.position - transform.position и объявлении в Quaternion.Euler объект "А" поворачивается на 0.


Ілля Мельник ответил Андрею

Андрей Полковенков


Андрей Полковенков ответил Ілле

Так что ли?
transform.rotation = Quaternion.Lerp(transform.rotation, player.rotation, speed * Time.deltaTime);

Константин Фролов


Константин Фролов

Андрей Полковенков


Андрей Полковенков


Создаем 3D-проект, открываем Ассет Стор, если у вас нет вкладки Asset Store, то переходим во вкладку сверху Window - Asset Store.

В поисковой строке пишем Car и открываем первый пакет моделей. Нажимаем кнопку Download, ждем, пока скачается пакет, а далее нажимаем кнопку Import. В появившемся окне нажимаем Import.

Переходим на вкладку Scene, сделаем дорогу, создаем Plane и клавишами CTRL+D дублируем плэйн и перемещаем его инструментом Move, создавая дорогу. В окне проекта нажимаем All Prefabs, выбираем машину и перемещаем ее на сцену. Добавляем на объект машины физику, AddComponent - Physics - Rigidbody. Добавляем box collider,

AddComponent - Physics - Box collider. Настраиваем его границы с помощью инструмента в компоненте Edit Collider.

Создаем папку для скрипта, ПКМ по папке Asset - Create - Folder и даем название Script. Создаем скрипт в папке и называем его PlayerControl.

  • movementSpeed - скорость передвижения.
  • turningSpeed - скорость поворота.
  • vertical - движение по вертикали.
  • horizontal - движение по горизонтали.



Сохраняем скрипт и перемещаем его на персонажа. Запускаем Юнити и проверяем.

Далее настраиваем расположение камеры.



Запускаем и проверяем.

Сделаем переключатель передач. Для этого переходим обратно в скрипт и пишем в Update. Если мы нажали клавишу “1” на клавиатуре, то скорость машины будет 10. Если клавишу “2”, то 15 и так далее.



Сделаем вывод скорости на экран. Для этого объявим еще одну переменную типа текст.



И в конце Update пишем, что в текст мы записываем значение скорости и приводим его к типу String.



В компоненте текста пишем 10.



Скрипт:

Запущенная игра с управляемым персонажем

Чтобы создать свой виртуальный мир, нужен какой-то начальный персонаж, который сможет по крайней мере двигаться.

Я решил не заморачиваться с кодом. Так как я новичок, путевого ничего все равно не напишу. Следовательно, первое время буду использовать готовые ассеты. Устанавливать их можно из официального Asset Store Unity. Не сложнее, чем моды для игр.

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

Создание земли (Terrain)

Создать землю в Unity очень легко.

  1. Добавляем на сцену Terrain (GameObject → 3D Objects → Terrain).
  2. Выбираем ее в окне иерархии слева, а справа в Inspector открываем раздел Terrain.
  3. Здесь выбираем режим Paint Terrain (кисточка), ниже в поле выбираем Raise or Lower Terrain и начинаем рисовать себе горы и овраги доступными кистями. Настраиваем размер и просто водим кисточкой по террейну.
  4. Находим в интернете любую бесшовную текстуру травы. Здесь же, в инспекторе выбираем режим Paint Texture, создаем слой и запихиваем туда эту текстуру.

Мои зеленые горы

И вот у нас уже есть какие-то зеленые горы… Сойдет для начала.

Создание персонажа (First Person Controller)

  1. Идем в Asset Store, находим готовый ассет Mini First Person Controller.
  2. Нажимаем кнопку ADD TO MY ASSETS, соглашаемся с лицензией.
  3. Далее нажимаем OPEN IN UNITY.
  4. В самом Unity у нас открывается Package Manager с этим ассетом. Нажимаем Download, ждем загрузки, затем Import, потом еще раз.
  5. Находим в корневой папке проекта новую папку First Person Controller. Заходим внутрь.
  6. Находим там болванку с названием First person controller full и просто перетаскиваем на Terrain. Немного приподнимаем над землей, чтобы не застрял.

Перетаскиваем готового персонажа на сцену

Запускаем игру, бегаем, наслаждаемся своим шедевром. В этом ассете уже присутствуют звуки шагов, возможность прыгать, приседать, ускоряться. Все настройки найдете в инспекторе.

Читайте также: