Vector3 v = new Vector3(1, 1, 1);
v.x = 5;
为什么我不能这样做?我要做v = new Vector3(5, v.y, v.z);
我认为这背后的原因是为了性能。但我无法猜测为什么这是必要的。
编辑:
我撒谎了,这确实有效。Vector3
我一直在使用的总是transform.position
返回其自身的副本,这就是为什么在其上设置值不起作用的原因。某种 Unity 魔法。
Vector3 v = new Vector3(1, 1, 1);
v.x = 5;
为什么我不能这样做?我要做v = new Vector3(5, v.y, v.z);
我认为这背后的原因是为了性能。但我无法猜测为什么这是必要的。
我撒谎了,这确实有效。Vector3
我一直在使用的总是transform.position
返回其自身的副本,这就是为什么在其上设置值不起作用的原因。某种 Unity 魔法。
我撒谎了,这确实有效。我一直在使用 transform.position 的 Vector3 总是返回其自身的副本,这就是为什么在其上设置值不起作用的原因。某种 Unity 魔法。
实际上,原因是 Vector3 是结构体。在 C# 中,结构是值类型。所以它们总是由值返回,因为类可以通过引用传递/返回。对于包装结构成员的所有属性(如 Rect、Vector2 等),它的行为都是相同的
由于这是一个属性,因此当您调用 get 方法时,它会返回结构位置的副本值。您将始终需要将其分配给本地 ref,对其进行修改然后重新分配:
Vector3 t_Pos = transform.position;
t_Pos.Normalize();
transform.position = t_Pos;
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));
}
}
}
(免责声明:我不是 Unity 开发人员)
我看到的每个示例都初始化了一个新的Vector3
..,这意味着这些属性在 Unity 中可能是只读的(它们不在 XNA 中)。
但是,文档显示Set()
了' Vector3
s. 所以你可以(显然)这样做:
v.Set(5, v.y, v.z);
Unity 的 Vector3s 确实也是结构体 - 因此您需要创建一个新实例,即使您只更改一个值。正如您已经提到的,针对问题本身,Vector3 的属性不是只读的。