Программирование с использованием класса Quaternion
Unity использует класс Quaternion, чтобы хранить трёхмерную ориентацию GameObject, а также описывать относительный поворот из одной ориентации в другую.
На этой странице дан обзор класса Quaternion и типичных сценариев его использования в скриптах. Полный справочник по всем членам класса Quaternion см. в Справочная информация о кватернионах.
Важно понимать разницу между Эйлеровыми углами (значения X, Y и Z, которые вы видите в инспекторе для вращения объекта). GameObject), и базовое значение кватерниона, который Unity используется для хранения фактического вращения GameObjectsВместо " основы этой темы " читать " основы этой темы ". Ротация и ориентация в Unity.
Работая с поворотами в скриптах, используйте класс Quaternion и его функции для создания и изменения значений поворота. Иногда углы Эйлера уместны, но помните: — используйте функции класса Quaternion, работающие с углами Эйлера; — считывание, изменение и повторное применение значений Эйлера к повороту может дать непреднамеренные побочные эффекты (см. ниже).
Создание и обработка кватернионов напрямую
В классе Quaternion в Unity есть ряд функций, позволяющих создавать повороты и работать с ними, вообще не прибегая к углам Эйлера; именно их и стоит использовать в большинстве типичных случаев. Каждая из ссылок ниже ведёт в справочник по скриптам с примерами кода:
Создание поворотов:
Манипулирование вращениями:
Класс Transform также предоставляет методы для работы с поворотами Quaternion:
Работа с Эйлеровыми углами
В некоторых случаях более желательно использовать Эйлеровы углы в ваших скриптах. При этом важно отметить, что вы должны сохранять ваши углы в переменных и использовать их только для применения их как Эйлеровых углов к вашему вращению, которое в конечном итоге должно храниться как кватернион. Хотя можно получить Эйлеровы углы из кватерниона, если вы получаете, изменяете и повторно применяете, вероятно, возникнут проблемы.
Более подробно о том, как именно могут возникать эти проблемы, вы можете прочитать на справочной странице скрипта eulerAngles.
Вот некоторые примеры ошибок, часто совершаемых с помощью гипотетического примера попытки повернуть GameObject вокруг оси 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);
}