Unity中的世界坐标和局部坐标,Transform和Translate等问题的讨论。

今天感触良多,故于此一记。

首先,对于世界坐标和局部坐标。

这是两个cube,是我们今天的主角。首先是这个父Cube,我们注意到它此时坐标为(0,0,0),由于他在根目录,所以他的transform.position就是他的世界坐标。


这里之所以用TransformDirection而不是Transformpoint,因为TransformPoint会受到其他因素的影响,可以去Unity官网查一下文档。

我们挪动一下

就验证了我们的猜想,

而对于他的子Cube,


扫描二维码关注公众号,回复: 1724219 查看本文章

他的Transform是相对于他的父物体Cube的,而不是相对于世界坐标系。这点从转换到世界坐标的变化可以得知。

接下来我们讲一讲,Vector3.forward和transform.forward的区别,Vector3.forward的值永远是(0,0,1)(这里的(0,0,1)是世界坐标的(0,0,1)),而transform.forward我们可以理解为其对应物体的z轴方向,是一个向量,而不是一个坐标,但是我们应当把它看成世界坐标系内的,而不是局部坐标系内的。而transform的属性可以在我上面提到的对比来思考。是继承关系。

想要让物体向前移动,在transform.translate()上和直接修改transform.position上,差别是挺大的。

transform.position 本身就是世界坐标。

1、transform.position+= vector3.forward 

等于是在世界坐标的z轴前进。

2、transform.position+=transform.forward 

等于是物体自身坐标系的z轴前进。


3、transform.translate(vector3.forward,space.self) 

等于是自身坐标系的z轴前进。

效果等同于2。

4、transform.translate(transform.forward,space.self) 

这个用法会引起很怪异和鬼畜的后果,不建议使用。

5、transform.translate(vector3.forward,space.world)

等于是让物体沿着世界坐标的z轴前进。

效果等同于1。

6、transform.translate(transform.forward,space.world)

等于是让物体沿着“物体自身坐标z轴在世界坐标上的方向”前进(等同与物体沿着自身z轴前进)。

效果等同于2。

有些同学可能不太理解以上部分的含义,没关系,我们可以先记住,在后面自然就懂了。但我这里还是要讲一下。

对于translate(a,b)函数,如果省略b,系统将把它缺省为space.self,意思是在自身坐标系进行a向量方向的移动,如果b为space.world,那么物体就在世界坐标系上进行a向量方向的移动。还是不懂得话大家可以自己写一个小Demo试验一下,不要怕麻烦,学习从来没有捷径。

最后,总结一下,除了translate这种比较特殊的函数,其他的,比如SimpleMove,DrawLine等,如果要在游戏物体前方进行操作,一概使用transform.forward,但是要注意,他只是个模为1的向量,别忘了根据自己的需求灵活变化,这里需要大家自行体会!

参考:https://blog.csdn.net/kaluluosi111/article/details/17206655

          https://blog.csdn.net/ithot/article/details/68485587

猜你喜欢

转载自blog.csdn.net/qq_15020543/article/details/80777249