我目前正在尝试使用从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.
答案 0 :(得分:9)
因为Vector3
是struct
,意味着'值类型',而不是'引用类型'。所以,属性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)
您不应该以这种方式修改相机位置。
答案 2 :(得分:1)
您无法修改位置的单个坐标。你必须重新分配整个矢量:
Vector3 newVal;
newVal.x = transform.position.x = Mathf.Clamp(transform.position.x, xmin, xmax);
...
transform.position = newVal;