Vector3如何实现,为什么这些属性为只读?

Far*_*her 3 c# performance unity-game-engine

Vector3 v = new Vector3(1, 1, 1);
v.x = 5;
Run Code Online (Sandbox Code Playgroud)

我为什么不能这样做?我要做v = new Vector3(5, v.y, v.z);

我认为这背后的原因是性能。但是我无法猜测为什么这是必要的。


编辑:

我撒了谎,这确实有效。Vector3我一直在使用的I transform.position总是返回自身的副本,这就是为什么在其上设置值不起作用的原因。某种Unity魔术。

小智 5

我撒了谎,这确实有效。我一直在使用transform.position的Vector3总是返回其自身的副本,这就是为什么在其上设置值不起作用的原因。某种Unity魔术。

实际上,原因是Vector3是结构。在C#中,结构是值类型。因此,它们总是按值返回,因为类可以通过引用传递/返回。包装结构成员的所有属性(例如Rect,Vector2等)的行为都相同。

由于这是一个属性,因此get方法在调用它时返回结构位置的副本值。您将始终需要将其分配给本地引用,对其进行修改然后重新分配:

Vector3 t_Pos = transform.position;
t_Pos.Normalize();
transform.position = t_Pos;
Run Code Online (Sandbox Code Playgroud)


Sim*_*ead 1

(免责声明:我不是 Unity 开发人员)

我看到的每个示例都初始化了一个新的Vector3..,这意味着这些属性在 Unity 中可能是只读的(它们不在 XNA 中)。

但是,文档显示了Set()的方法Vector3。所以你可以(显然)这样做:

v.Set(5, v.y, v.z);
Run Code Online (Sandbox Code Playgroud)