在Unity3D中,直接设置游戏对象的四元数,而无需每次构造新对象



我有一个传感器,它提供四元数,我想将其应用于GameObject。

我目前的工作代码如下:
transform.rotation = new Quaternion(x, y, z, w);
这是正确的,它修改了它所连接的游戏对象的旋转,以它应该旋转的方式。

然而,问题是,每帧构建一个新对象似乎非常浪费,所以我想修改现有的对象。我尝试了以下代码:
transform.rotation.Set(x, y, z, w);
此代码根本不会修改GameObject的旋转。

我可以在不每次构造新对象的情况下修改GameObject的四元数吗?

正如您在文档中看到的,Quaternion是一个结构,而不是引用类型。

这意味着:

  • transform.rotation返回对象当前旋转的副本。因此,您不能通过调用transform.rotation.Set(x, y, z, w);来修改它。你必须使用任务调用
  • 通过在成员字段中缓存旋转不会提高性能,因为赋值无论如何都会复制它,并且本地四元数是在堆栈上分配的

如果您担心性能(不应该仅仅因为四元数构造而担心性能(,我建议您将transform缓存在成员中,因为Unity的transform成员每次使用它时都会调用this.gameObject.GetComponent<Transform>(),这是一个相当昂贵的操作。尽管要进行真正的优化,我们需要知道您的确切代码。

示例:

public class MyClass
{
// to be used instead of Unity's transform member
private Transform myTransform;

private void Awake()
{
// make expensive call only once during Awake
myTransform = transform;
}

来自API:转换旋转

请勿尝试编辑/修改旋转。

我怀疑这是因为rotation纯粹是为了方便使用,实际的转换矩阵只在函数或属性集调用期间更新。因此,直接修改rotation不会触发矩阵更新。

您可以尝试修改旋转,然后调用rotate(0,0,0),但不能保证这会起作用,因为rotation可能不是"基本事实",甚至可能不会被存储。它可以根据矩阵的请求生成。

最新更新