Unity:无法修改`UnityEngine.Transform.position'的值类型返回值

时间:2013-09-21 00:34:22

标签: c# unity3d

我目前正在尝试使用从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.

3 个答案:

答案 0 :(得分:9)

因为Vector3struct,意味着'值类型',而不是'引用类型'。所以,属性Transform.position的getter会返回一个'NEW'Vector3作为结果。如果您直接修改它,则会修改“新”Vector3,而不是Transform.position属性。那是清楚的吗?

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

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

你应该声明一个新的Vector3,并使用Transform.position的getter进行初始化,修改它,并使用它的setter更改Transform.position

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

不要担心Vector3 _tmp,它只是值类型,不会创建内存碎片。

答案 1 :(得分:1)

About Compiler Error CS1612

您不应该以这种方式修改相机位置。

答案 2 :(得分:1)

您无法修改位置的单个坐标。你必须重新分配整个矢量:

Vector3 newVal;
newVal.x = transform.position.x = Mathf.Clamp(transform.position.x, xmin, xmax);
...
transform.position = newVal;