Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты
к API скриптам

Важные классы - Quaternion

Unity использует Quaternionстандартный способ Unity для представления поворотов в виде данных. При написании кода, имеющего дело с поворотами, обычно следует использовать класс Quaternion и его методы. Подробнее
См. в классе Словарь
для хранения трехмерной ориентации GameObjectsОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь
, а также использовать их для описания относительного поворота от одного ориентация на другого.

На этой странице представлен обзор класса Quaternion и его частого использования при написании сценариев с его помощью. Исчерпывающую информацию о каждом члене класса Quaternion см. в справочнике по скрипту Quaternion.

Важно понимать разницу между углами Эйлера (значениями X, Y и Z, которые вы видите в инспекторе для поворота GameObject) и базовым значением Quaternion, которое Unity использует для хранения фактического поворота GameObjects. Основы этой темы см. в статье Вращение и ориентация в Unity.

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

Непосредственное создание кватернионов и управление ими

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

Создание поворотов:

Управление поворотами:

Класс Transform также предоставляет методы, позволяющие работать с поворотами кватерниона:

Работа с углами Эйлера

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

Подробнее о том, как именно могут возникнуть эти проблемы, можно прочитать на справочной странице скриптов eulerAngles.

Вот несколько примеров ошибок, которые обычно делаются на гипотетическом примере попытки повернуть игровой объект вокруг оси X со скоростью 10 градусов в секунду. Вот чего следует избегать:

// rotation scripting mistake #1 // the mistake here is that we are modifying the x value of a quaternion // this value does not represent an angle, and does not produce desired results void Update () { var rot = transform.rotation; rot.x += Time.deltaTime * 10; transform.rotation = rot; } // rotation scripting mistake #2 // Read, modify, then write the Euler values from a Quaternion. // Because these values are calculated from a Quaternion, // each new rotation might return very different Euler angles, which might suffer from gimbal lock. void Update () { var angles = transform.rotation.eulerAngles; angles.x += Time.deltaTime * 10; transform.rotation = Quaternion.Euler(angles); }

А вот пример использования углов Эйлера в скрипте правильно:

// Rotation scripting with Euler angles correctly. // Store the Euler angle in a class variable, and only use it to // apply it as an Euler angle, but never rely on reading the Euler back. float x; void Update () { x += Time.deltaTime * 10; transform.rotation = Quaternion.Euler(x,0,0); }

Дополнительную информацию см. на странице справочника по скрипту Quaternion.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3