文章目录
API 简介
Translate 方法是 Transform 类下的一个公共方法。一般可以用于物体的位移。
方法的第一个参数表示位移多少,一般用移动方向×速度 ×时间来表示。
方法的第二个参数表示相对于哪个坐标系进行移动。如果没有传第二个参数,默认是相对于自己的坐标系。
Translate 的不同用法组合
在介绍 Translate 方法的具体使用方式之前,我先画出世界坐标系和本地坐标系便于大家后续理解。
现在新建一个物体,假设它的世界坐标系是这样的:(刚刚创建的物体本地坐标系也和世界坐标系重合)
现在将物体绕 y 轴顺时针旋转一定角度。
现在黑色坐标系是世界坐标系,红色坐标系是物体旋转后的本地坐标系(因为是绕 y 轴转所以 y 轴不动,就不标红了)。
1)相对于自己坐标系下的z轴正方向移动(往面朝向移动)
transform.Translate(Vector3.forward*1*Time.deltaTime);
把物体当作人,那么就是朝人的前方移动。
这个比较好理解,就是在自己的坐标系下,往(0,0,1)的方向移动。在上图中就是沿着红色的 z 轴方向移动。
2)相对于世界坐标系下,自己的面朝向移动
transform.Translate(transform.forward*1*Time.deltaTime,Space.World);
效果和上面那种方法是相同的,都是沿着红色的 z 轴方向移动。
这里简单提一下 transform.forward,它代表了物体当前的面朝向(自身的z 轴指向),并且是相对于世界坐标系下的!
也就是用自己坐标系下的(0,0,1)投影到世界坐标系下的各分量来表示 forward 得出的向量,以上面画的坐标系图为例,就是这样理解:
transform.forward 得出的向量就是(Zx,0,Zz),从黑色的世界坐标系来看就是沿着红色的 z 轴方向。
3)相对于世界坐标系下的z轴正方向移动
transform.Translate(Vector3.forward*1*Time.deltaTime,Space.World);
此时物体只会朝黑色的 z 轴移动。
4)相对于自己坐标系下,自己的面朝向移动
(一般不会这样用)
transform.Translate(transform.forward*1*Time.deltaTime,Space.Self);
transform.forward 得到的向量是相对于世界坐标系的,可这时候我们要求相对于自己的坐标系,那么必须将原来 forward 得到的向量转化成自己坐标系的一个向量。这时候物体的移动方向也就不会是自己的面朝向了。
最后的移动方向是蓝色的 z’ 轴。
以上面这张图为例,就是原先由黑色 z 轴转到红色 z 轴旋转了一定角度。然后再从红色 z 轴旋转相同的角度到蓝色 z’ 轴的方向(有点像将原来的世界坐标系旋转到红色的坐标系,那么原本相对于黑色坐标系的红色 z 轴就相应变成了相对于原本红色坐标系的蓝色 z’ 轴)。
总结
如果想实现物体沿自身方向移动,比如游戏中常见的人物移动,参考前两种方法就好了。尤其注意不要掉入最后一种方式的陷阱,因为有可能会写成 :
transform.Translate(transform.forward*1*Time.deltaTime);
那么它是无法实现我们正常想要看到的人物移动效果的。