unity中有几个可以直接使用的方向向量,分别是transform.forward,transform.up,transform.right和Vector3.forward,Vector3.up,Vector3.right。
从数值上来说,transform.forward,transform.up,transform.right是游戏物体自身坐标系中的三个轴的方向向量,而Vector3.forward,Vector3.up,Vector3.right是世界坐标的三个轴。
但是当transform.translate和transform.rotate函数使用到这几个向量时则要注意。
比如我们想让一个物体始终沿自身坐标系向前移动,想当然的会这样写
void Update()
{
if(Input.GetKey(KeyCode.W))
transform.Translate(transform.forward * Time.deltaTime * 1.0f);
}
但是这样如果物体坐标系与世界坐标不一致时,移动方向会很诡异,既不是沿着世界坐标的轴也不是沿着自身坐标的轴,下图黑色尖头为实际移动方向。
这个诡异的方向是怎么来的呢
如上图,设自身坐标系中蓝色箭头为x1,黑色箭头为y1,将物体坐标系通过旋转使其与世界坐标重合,那么y1也随之一起旋转得到了左边的黑色箭头y2,而y2与x1平行,即方向向量相同,将这个过程倒推得到的y1就是实际的移动方向。那么显然,这个复杂的过程和它得到的结果都不是我们想要的。
实际上,translate和rotate这两个函数都是可以输入坐标系参数的,如果不输入则默认为space.self。如果要想沿自身坐标向前移动有两种写法,沿自身坐标系进行旋转同理
transform.translate(vector3.forward,Space.self)
transform.translate(transform.forward,Space.world)