Unity 使用 四元数Unity 表示旋转数据的标准方式。在编写处理旋转的代码时,通常应该使用 Quaternion 类及其方法。更多信息
参见 术语表 类来存储 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的功能由附加在其上的组件定义。更多信息
参见 术语表 的三维方向,以及使用它们来描述从一个方向到另一个方向的相对旋转。
此页面提供了 Quaternion 类的概述及其在使用脚本时的一些常见用法。有关 Quaternion 类每个成员的详尽参考,请参阅 Quaternion 脚本参考。
了解欧拉角(您在检查器中看到的用于游戏对象旋转的 X、Y 和 Z 值)与 Unity 用于存储游戏对象实际旋转的底层四元数值之间的区别非常重要。有关此主题的基础知识,请阅读 Unity 中的旋转和方向。
在处理脚本中的旋转时,应使用 Quaternion 类及其函数来创建和修改旋转值。在某些情况下,使用欧拉角是有效的,但您应牢记:- 应使用处理欧拉角的 Quaternion 类函数- 从旋转中检索、修改和重新应用欧拉值可能会导致意外的副作用(见下文)
Unity 的 Quaternion 类有很多函数,允许您在根本无需使用欧拉角的情况下创建和操作旋转,并且在大多数典型情况下都应该使用这些函数。每个链接都指向包含代码示例的脚本参考。
Transform 类还提供允许您使用四元数旋转的方法
在某些情况下,在脚本中使用欧拉角更可取。这样做时,请务必注意,必须将角度保存在变量中,并且仅使用它们以欧拉角的形式应用到旋转,而旋转最终仍应存储为四元数。虽然可以从四元数中检索欧拉角,但如果检索、修改和重新应用,则可能会出现问题。
您可以在 eulerAngles 脚本参考页面 中阅读有关这些问题如何出现的更多详细信息。
以下是一些使用假设示例(尝试以每秒 10 度的速度围绕 X 轴旋转游戏对象)时常见错误的示例。这正是您应该避免的。
// 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);
}