首页 > 未分类 > 摄像机跟随时使用EasyTouch控制角色移动方向的问题
2019
11-26

摄像机跟随时使用EasyTouch控制角色移动方向的问题

摄像机跟随时使用EasyTouch控制角色移动方向的问题 - 第1张  | 逗分享开发经验

EasyTouch插件是一个很好的触屏控制插件,很多Unity游戏的摇杆等就是用EasyTouch制作的。

摄像机z轴不变的情况

在一些摄像机指向固定不动(相对于世界坐标系)的游戏中(例如王者荣耀等),使用EasyTouch的常用方法可正常控制角色上下左右移动。代码和下面类似:

//获取EasyTouch的摇杆坐标
Vector2 joystickPosition = joystick.JoystickAxis;
//人物转向
this.transform.LookAt(transform.postion + new Vector3(joystickPosition.x,0,joystickPosition.y);
//人物向transform.forward(即人物的朝向在世界坐标系中方向向量)移动
//Transform.Translate第二个参数默认为自身坐标系,因此可以直接使用Vector3.forward。
this.transform.Translate(Vector3.forward * Time.deltaTime);

这种方法的原理如下图:
摄像机跟随时使用EasyTouch控制角色移动方向的问题 - 第2张  | 逗分享开发经验

摄像机z轴发生改变的情况

如果采用摄像机跟随第三人称人物移动且摄像机方向与人物朝向同步时,上述移动就会出现一些问题。例如本人的摄像机z轴始终跟随角色z轴,此时拖动摇杆会产生预料外的角色移动。当角色朝向世界坐标轴z轴的反方向时(摄像机z方向与人物z方向同步),向上推动摇杆,角色会瞬间转向至世界坐标轴的正方向(即之前角色朝向的反方向)并开始移动。这肯定不是我们所期望的效果,一般情况下,用户期望的效果是向上推动摇杆时人物向前移动,即向本地坐标系的z轴正方向移动用户期望如图所示
摄像机跟随时使用EasyTouch控制角色移动方向的问题 - 第3张  | 逗分享开发经验
想想平日玩过的崩坏3rd,思考逻辑。
问题主要出在人物转向这一步,使用上面代码时,我们的转向标准是相对于世界坐标系的(详见图1),因此当我们向上拉摇杆时,会瞬间LookAt到世界坐标系z轴正方向,这是不符合用户操作习惯的。为了解决这个问题,我们需要让角色的旋转角度参照本地坐标轴旋转,而这其中的关键点在于获取与摇杆对应的角色旋转角度。示意图如下:
摄像机跟随时使用EasyTouch控制角色移动方向的问题 - 第4张  | 逗分享开发经验
只要获得了图中的旋转角度,让角色按照自身y轴旋转,这样角色的z轴就会指向我们所期望的方向。下面是我求旋转角度的方法。

float joystickX = joystick.JoystickAxis.x;
float joystickY = joystick.JoystickAxis.y;
float rotateY = 0f;
if(joystickY > 0)
{
        //第一二象限
        //一二象限角度值的正负及大小和我们需要的一致,正常求解即可
        //Mathf.Atan计算并返回参数 f 中指定的数字的反正切值。返回值介于负二分之 pi 与正二分之 pi 之间。
        rotateY = Mathf.Atan(joystickX/joystickY) * 180/Mathf.PI;
}else if(joystickY < 0 && joystickX < 0)
{
        //第三象限
        //用-180°加上摇杆轴线与与y轴负方向间的夹角
        rotateY = -180 + Mathf.Atan(joystickX/joystickY) * 180/Mathf.PI;
}else if(joystickY < 0 && joystickX > 0)
{
        //第四象限
        //用180°加上摇杆轴线与y轴负方向的夹角
        rotateY = 180 + Mathf.Atan(joystickX/joystickY) * 180/Mathf.PI;
}
this.transform.Rotate(0,rotateY  * turnSpeed /180,0);
cc.SimpleMove(this.transform.forward * 5);
ani.CrossFade("Running@loop");

效果
摄像机跟随时使用EasyTouch控制角色移动方向的问题 - 第5张  | 逗分享开发经验

Bug

当摇杆处于第三象限时若将摇杆移动到第四象限,则会发生顺时针旋转的情况(负角度会恢复到0再继续增加到正角度),但旋转的结果是正确的,无伤大雅,懒得改了。

最后编辑:
作者:搬运工