以度为单位返回或设置旋转的欧拉角表示。
欧拉角可以通过围绕各个轴执行三个单独的旋转来表示三维旋转。在 Unity 中,这些旋转依次围绕 Z 轴、X 轴和 Y 轴执行。
您可以通过设置此属性来设置四元数的旋转,并且可以通过读取此属性来读取欧拉角值。
当使用 .eulerAngles 属性设置旋转时,务必理解,尽管您提供了 X、Y 和 Z 旋转值来描述您的旋转,但这些值不会存储在旋转中。相反,X、Y 和 Z 值将转换为四元数的内部格式。
当您读取 .eulerAngles 属性时,Unity 会将四元数的内部旋转表示转换为欧拉角。因为可以使用多种方法使用欧拉角表示任何给定的旋转,所以您读取的值可能与您分配的值大不相同。如果您尝试逐渐增加这些值以生成动画,这可能会造成混淆。有关更多信息,请参阅底部的脚本示例。
为了避免此类问题,建议使用旋转的方法是避免在读取 .eulerAngles 时依赖一致的结果,尤其是在尝试逐渐增加旋转以生成动画时。有关实现此目的的更好方法,请参阅Quaternion * 运算符。
以下示例演示了如何根据用户的输入使用 eulerAngles 旋转游戏对象。该示例显示我们从不依赖于读取 Quanternion.eulerAngles 来递增旋转,而是使用我们的 Vector3 currentEulerAngles 设置它。所有旋转更改都发生在 currentEulerAngles 变量中,然后应用于四元数以避免上述问题。
using UnityEngine; public class ExampleScript : MonoBehaviour { float rotationSpeed = 45; Vector3 currentEulerAngles; Quaternion currentRotation; 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;
//moving the value of the Vector3 into Quanternion.eulerAngle format currentRotation.eulerAngles = currentEulerAngles;
//apply the Quaternion.eulerAngles change to the gameObject transform.rotation = currentRotation; }
void OnGUI() { GUIStyle style = new GUIStyle(); style.fontSize = 24; // Use eulerAngles to show the euler angles of the quaternion stored in Transform.Rotation GUI.Label(new Rect(10, 0, 0, 0), "Rotating on X:" + x + " Y:" + y + " Z:" + z, style);
//outputs the Quanternion.eulerAngles value GUI.Label(new Rect(10, 25, 0, 0), "CurrentEulerAngles: " + currentEulerAngles, style);
//outputs the transform.eulerAngles of the GameObject GUI.Label(new Rect(10, 50, 0, 0), "GameObject World Euler Angles: " + transform.eulerAngles, style); } }
以下示例演示了即使您读取的 .eulerAngles 值与分配的值大不相同,它们也可能表示相同的旋转。
using UnityEngine;
// demonstration of eulerAngles not returning the same values as assigned public class EulerAnglesProblemExample : MonoBehaviour { private void Start() { Quaternion myRotation = Quaternion.identity; myRotation.eulerAngles = new Vector3(150, 35, 45);
Debug.Log(myRotation.eulerAngles);
// output is: (30.0, 215.0, 225.0) } }