4
Vector3 v = new Vector3(1, 1, 1);
v.x = 5;

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

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


编辑:

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

4

4 回答 4

5

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

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

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

Vector3 t_Pos = transform.position;
t_Pos.Normalize();
transform.position = t_Pos;
于 2014-07-22T13:00:09.117 回答
2

Unity 不允许直接访问 Transform.position 因为位置是派生的。换句话说,Unity 内部存储了一个变换矩阵,所以当你得到位置时,它会从变换矩阵中获取它的副本。

所以它可能看起来有点像这样的位置:

public class Transform
{
    public Vector3 position
    {
        get
        {
            // it would be this if the matrix itself is in world space
            return new Vector3(matrix.m30, matrix.m31, matrix.m32);
        }

        set
        {
            // it probably doesn't use these mono bindings, but
            // I'll use them here for this example
            matrix.SetRow(3, new Vector4(value.x, value.y, value.z));
        }
    }
}
于 2018-10-22T04:33:06.050 回答
1

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

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

但是,文档显示Set()了' Vector3s. 所以你可以(显然)这样做:

v.Set(5, v.y, v.z);
于 2013-09-11T05:03:55.383 回答
1

Unity 的 Vector3s 确实也是结构体 - 因此您需要创建一个新实例,即使您只更改一个值。正如您已经提到的,针对问题本身,Vector3 的属性不是只读的。

资源

于 2013-09-12T06:27:35.547 回答