我有一个传感器,它提供四元数,我想将其应用于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
可能不是"基本事实",甚至可能不会被存储。它可以根据矩阵的请求生成。