TransformHandle.eulerAngles
Declaration
public Vector3 eulerAngles;Описание
Вращение как Эйлеров угол в градусах.
TransformHandle.eulerAngles представляет вращение в мировом пространстве. При просмотре вращения GameObject в Inspector, вы можете увидеть другие значения угла, чем те, которые хранятся в этом свойстве. Это потому, что Inspector отображает локальное вращение, для более подробной информации см. TransformHandle.localEulerAngles.
Эйлеровы углы могут представлять трехмерное вращение, выполняя три отдельных вращения вокруг отдельных осей. В Unity эти вращения выполняются вокруг оси Z, оси X и оси Y, в этом порядке.
Вы можете установить вращение кватерниона, установив это свойство, и вы можете прочитать значения Эйлеровых углов, прочитав это свойство.
Когда вы задаёте поворот через свойство .eulerAngles, важно понимать: хотя вы описываете поворот значениями по осям X, Y и Z, именно эти значения в повороте не сохраняются. Вместо этого значения X, Y & Z преобразуются во внутренний формат Quaternion.
Когда вы читаете свойство .eulerAngles, Unity преобразует внутреннее представление поворота в Quaternion в углы Эйлера. Поскольку один и тот же поворот можно описать углами Эйлера несколькими способами, считанные значения могут заметно отличаться от тех, которые вы присваивали. Это может сбивать с толку, если вы пытаетесь постепенно наращивать значения для получения анимации.
Чтобы избежать подобных проблем, рекомендуемый способ работы с вращениями заключается в том, чтобы не полагаться на последовательные результаты при чтении .eulerAngles, особенно при попытке постепенно увеличивать вращение для создания анимации. Для лучших способов достижения этого, см. Оператор кватерниона *.
Следующий пример демонстрирует вращение GameObject с помощью eulerAngles на основе ввода пользователя. Пример показывает, что мы никогда не полагаемся на чтение Quanternion.eulerAngles для увеличения вращения, вместо этого мы устанавливаем его с помощью наших Vector3 currentEulerAngles. Все изменения вращения происходят в переменной currentEulerAngles, которые затем применяются к кватерниону, избегая проблемы, упомянутой выше.
using UnityEngine; public class ExampleScript : MonoBehaviour { float rotationSpeed = 45; Vector3 currentEulerAngles; float x; float y; float z;
void Update() { if (Input.GetKeyDown(KeyCode.X)) x = 1 - x; if (Input.GetKeyDown(KeyCode.Y)) y = 1 - y; if (Input.GetKeyDown(KeyCode.Z)) z = 1 - z;
//modifying the Vector3, based on input multiplied by speed and time currentEulerAngles += new Vector3(x, y, z) * Time.deltaTime * rotationSpeed;
//apply the change to the gameObject TransformHandle thisTransformHandle = transformHandle; thisTransformHandle.eulerAngles = currentEulerAngles; }
void OnGUI() { GUIStyle style = new GUIStyle(); style.fontSize = 24; GUI.Label(new Rect(10, 0, 0, 0), "Rotating on X:" + x + " Y:" + y + " Z:" + z, style);
GUI.Label(new Rect(10, 25, 0, 0), "transformHandle.eulerAngle: " + transformHandle.eulerAngles, style); } }
Не устанавливайте одну из осей eulerAngles отдельно (например, eulerAngles.x = 10; ), так как это приведет к дрейфу и нежелательным вращениям. При установке их на новое значение устанавливайте их все одновременно, как показано выше. Unity преобразует углы в и из вращения, хранящегося в TransformHandle.rotation.
Углы выражаются модулем 360 градусов. Например, указание 1, 361, или -17999 приводит к тому же углу, как показано в предыдущем примере, где currentEulerAngles увеличивается со временем после 360 для x, y, и z.