很多人在学习Unity过程中,都遇到过对transform.position.x/y/z直接赋值时报错的情况。
只能用一个Vector3对postion进行整体的赋值
至于为什么会无法赋值,有一种很常见的说法:
看起来好像很有道理,但是——
异议あり!!!
真的是这样吗?
让我们使用F12导航到transform里,可以看到position是Vector3类型
而Vector3里的x/y/z并没有访问限制
那么究竟是为什么无法对transform.position.x/y/z赋值呢?
原因就在于Vector3是一个结构体,而position是一个自动实现的属性。
在C#里,结构体是值类型的,值类型在通过方法传递的时候,所传递的只是值的副本。
C#的属性可以说是两个分别名为get和set的方法
而当我们写出形如 transform.position.x = 1 这样的代码时,是在通过get方法得到position,然后修改position的x字段的值。
但是,由于position是结构体类型的,get得到的也只是position的一个副本,而对这个副本所作出的任何修改,都对原positon没有任何影响,因此这样的修改是毫无意义的。编译器会禁止这样的修改操作,也就是可以理解的了。