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

3

我目前正在尝试使用这段从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: 无法修改“UnityEngine.Transform.position”的值类型返回值。请考虑将该值存储在临时变量中。

3个回答

11

因为Vector3是一个结构体(struct),意味着它是“值类型”,而不是“引用类型”。所以,属性Transform.position的getter返回一个“新的”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

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

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

1

该脚本不旨在修改相机位置。它的目的是将相机限制在最大/最小x和z值内。 - hmtinc
在你的代码中,你说“transform.position.z 的新值是 Mathf.Clamp(transform.position.z, zmin, zmax)”,但是由于它是值类型并且通过值进行复制,所以 transform.position.z 是原始 transform.position 坐标的副本。 夹紧位置的正确方法(也适用于 Unity 脚本参考)是:
transform.position = new Vector3(Mathf.Clamp(transform.position.x, xmin, xmax), 0, Mathf.Clamp(transform.position.z, zmin, zmax));
- Valery Petrov
谢谢,我成功地使用上面的脚本将相机固定在地图上了,我不得不稍微修改一下它。但是它能用 :D - hmtinc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接