在Unity中不能对transform.position.x/y/z直接赋值的原因探究

很多人在学习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没有任何影响,因此这样的修改是毫无意义的。编译器会禁止这样的修改操作,也就是可以理解的了。

猜你喜欢

转载自blog.csdn.net/qq_32821435/article/details/79938144