版本:Unity 6 (6000.0)
语言:English
使用向量移动物体
使用常用数学函数

使用四元数进行旋转和方向

切换到脚本编写

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);
}

其他资源

使用向量移动物体
使用常用数学函数