Version: 6000.3
语言: 中文
Unity 中的四元数和欧拉旋转
静态游戏对象

使用 Quaternion 类编程

切换到脚本

Unity 使用四元数Unity 将旋转表示为数据的标准方式。在编写处理旋转的代码时,通常应该使用 Quaternion 类及其方法。更多信息
请参阅术语表
类来存储游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表
,以及使用它们来描述从一个方向到另一个方向的相对旋转。

本页概述了 Quaternion 类及其在编写脚本时的常见用途。有关 Quaternion 类的每个成员的详尽参考,请参阅 Quaternion 脚本参考

了解欧拉角(您在检查器中看到的用于游戏对象旋转的 X、Y 和 Z 值)与 Unity 用于存储游戏对象实际旋转的基础四元数值之间的差异非常重要。有关本主题的基础知识,请阅读 Unity 中的旋转和方向

在处理处理轮换时脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
,您应该使用 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);
}

其他资源

Unity 中的四元数和欧拉旋转
静态游戏对象