2

我目前正在尝试使用从 JavaScript 转换的以下代码将我的相机锁定到我在 Unity3D 中制作的地图:

transform.position.z = Mathf.Clamp(transform.position.z, zmin, zmax);
transform.position.x = Mathf.Clamp(transform.position.x, xmin, xmax);

但是 Unity 在编译时不断返回以下错误:error CS1612: Cannot modify a value type return value of 'UnityEngine.Transform.position'. Consider storing the value in a temporary variable.

4

3 回答 3

10

因为Vector3is a struct, 表示“值类型”,而不是“引用类型”。因此,该属性Transform.position的 getter 为结果返回一个“新” Vector3。如果你直接修改它,'NEW'Vector3被修改,'NOT'Transform.position属性。明白了吗?

Transform.position.x = 0; // this is wrong code
// is same with
Vector3 _tmp = Transform.position; // getter
_tmp.x = 0; // change 'NEW' Vector3

这显然不是你想要的,所以编译器告诉你这是一个问题。

你应该声明一个新的,并用'getterVector3初始化,修改它,然后改变Transform.positionTransform.position用它的setter改变。

Vector3 _tmp = Transform.position; // getter
_tmp.x = 0; // change 'NEW' Vector3
Transform.position = _tmp; // change Transform.position with it's setter

不用担心Vector3 _tmp,它只是值类型,不会产生内存碎片。

于 2013-09-23T00:31:17.060 回答
1

关于编译器错误 CS1612

您不应该那样修改相机位置。

于 2013-09-21T00:39:08.143 回答
1

您不能修改位置的单个坐标。您必须重新分配整个向量:

Vector3 newVal;
newVal.x = transform.position.x = Mathf.Clamp(transform.position.x, xmin, xmax);
...
transform.position = newVal;
于 2013-09-21T09:33:44.057 回答