在Unity中有两个forward,一个是Transform.forward一个是Vector3.forward。spa
对于Vector3来讲,它只是缩写。没有其它任何含义。3d
对于Transform.forward来讲,它表明当前物体的物体坐标系的z轴在世界坐标系上的指向。(世界坐标系中的蓝色轴)。code
若是使用Transform.Translate。须要注意Vector3和Transform是不一样的。orm
他们之间的区别主要体如今在不一样坐标系时的反映上。blog
transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
transform.Translate(transform.forward * Time.deltaTime, Space.World);
当局部坐标=世界坐标时。it
当局部坐标!=世界坐标时。(旋转30度)io
transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);
transform.Translate(transform.forward * Time.deltaTime, Space.Self);
当局部坐标=世界坐标时。form
当局部坐标!=世界坐标时。(旋转30度)class
transform.Translate
参数Space.Self
须要一个局部坐标系的方向向量,可是transform.forward是世界坐标的方向向量。因此除非必要,不然别用这句代码:变量
transform.Translate(transform.forward * Time.deltaTime, Space.Self);
这会让你物体的前进方向变的混乱。
应该用:
transform.Translate(transform.forward * Time.deltaTime, Space.World);//或者 transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);
小问题:为何旋转30°时,transform.Translate(transform.forward * Time.deltaTime, Space.Self);,这句代码会让物体往60°的方向移动呢?
首先transform.forward是自动对物体旋转值算出前进方向向量的变量。同时 transform.forward是当前物体的物体坐标系的z轴在世界坐标系上的指向。系统根据物理自己的局部坐标系计算出z轴在世界坐标系上的旋转值是30°,可是你使用transform.Translate而且设置了Space.Self按照局部坐标移动,那么,transform.forward这个30°的世界坐标的旋转又要根据物体的局部坐标系转化成局部坐标,那么两次30°+30°就是最后咱们所看到物体往世界坐标的60°旋转方向移动。
vector3.forward的值永远等于(0,0,1)。
transform.forward的值则等于当前物体的自身坐标系z轴在世界坐标上指向,所以不必定等于(0,0,1),可是其magnitude长度是1。
这也就是为何,transform.forward 转换为self自身坐标系时会有这种结果。
在world世界坐标系——space.world上的状况则彻底相反。
所以,想要让物体向前移动,在transform.translate()上和直接修改transform.position上,差异是挺大的。transform.position 自己就是世界坐标。
经常使用的移动方法总结下来有如下几种:
一、
//等因而在世界坐标的z轴前进。 transform.position += vector3.forward
二、
//等因而物体自身坐标系的z轴前进。 transform.position += transform.forward
三、
//等因而物体自身坐标系的z轴前进。效果等同于2。 transform.Translate(vector3.forward * Time.deltaTime,Space.Self) ;
四、
//上面出现的奇葩结果就是这个用法引发的,建议不是特殊须要别用这个用法。
transform.Translate(transform.forward * Time.deltaTime,Space.Self)
五、
//等因而在世界坐标的z轴前进。效果等同于1。 transform.Translate(vector3.forward * Time.deltaTime,Space.World)
六、
//等因而让物体沿着“物体自身坐标z轴在世界坐标上的方向”前进(等因而物体自身坐标系的z轴前进)。效果等同于2。 transform.Translate(transform.forward * Time.deltaTime,Space.World)