unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色



在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色

后来需要发布到手机上,于是就加了一个摇杆

键盘控制角色的代码已经写好了,角色八方向移动

如果按照传统的大众思路来控制的话,是达不到我想要的效果的,传统控制思路代码如下:

复制代码
 1 //当摇杆处于移动状态时,角色开始奔跑
 2   void OnJoystickMove(MovingJoystick move)
 3   {
 4     if (move.joystickName != "EasyJoystick")
 5     {
 6       return;
 7     }
 8     //获取摇杆偏移量
 9     float joyPositionX = move.joystickAxis.x;
10     float joyPositionY = move.joystickAxis.y;
11     if (joyPositionY != 0 || joyPositionX != 0)
12     {
13       //设置角色的朝向(朝向当前坐标+摇杆偏移量)
14        transform.LookAt(new Vector3(transform.position.x + joyPositionX, transform.position.y, transform.position.z + joyPositionY));
15       //移动玩家的位置(按朝向位置移动)
16       transform.Translate(Vector3.forward * Time.deltaTime * 7.5F);
17       //播放奔跑动画
18       animation.CrossFade("Run");
19     }
20   }
复制代码

 

如果要按照摇杆传统思路控制角色,在重新写控制角色代码的话非常麻烦,所以我就通过计算摇杆旋转角度来判断当前摇杆处于哪个方向

ok,现在我们开始来敲代码

 

首先,我们来调试观察一下摇杆的x轴、y轴的返回值

1     //移动摇杆中  
2     void OnJoystickMove(MovingJoystick move)
3     {
4         Debug.Log(move.joystickAxis.x + "," + move.joystickAxis.y);
5     }


调试结果为:

左:x = -1,y = 0;顺时针旋转X逐渐变大,Y逐渐变大

上:x = 0,y = 1;顺时针旋转X逐渐变大,Y逐渐变小

右:x = 1,y = 0;顺时针旋转X逐渐变小,Y逐渐变小

下:x = 0,y = -1;顺时针旋转X逐渐变小,Y逐渐变大

我们把摇杆底图看成是两个半圆,上半圆和下半圆

阴兵海配图 

                  阴兵海配图

那么:

X轴移动到左边时,X = -1;X轴移动到右边时:X = 1;X轴从左转到右旋转了180度

Y轴移动到左边时,Y = 0;Y轴移动到右边时:Y = 0;Y轴从左转到右旋转了180度

 

你如果直接看我的调试结果肯定有点晕,建议边调试边参考我的调试结果,这样才能理解

如果我们要计算当前摇杆在左上角旋转的度数怎么计算呢?

读过小学的人都可以做,只是看见摇杆返回的-1和0脑袋被绕迷糊了,我也一样,弄了好半天才弄好

当摇杆移动到左时,为0度、360度(因为360度为一圈,已经绕回远点了)

当摇杆移动到上时,为90度

当摇杆移动到右时,为180度

当摇杆移动到下时,为270度

既然知道是多少度这就好办多了

得出公式:

当X轴在右时为1,也就是X轴为180度,则:1 * 90 + 90 = 180

当前X轴旋转角度为:X轴返回值 * 90度 + 90度

 

你以为这就完事了吗?还高兴得太早,用这个公式计算只能得到上半圆的旋转角度

现在我们要获取下半圆旋转角度,然后用上半圆旋转角度 + 下半圆旋转角度 = 当前旋转角度

当摇杆移动到下半圆时我们怎么计算旋转角度呢?

我们已经知道Y轴在左边为0,在右边为0,在下边为-1,继续用计算X轴的公式

Y左:0 * 90 + 90 = 90

Y上:1 * 90 + 90 = 180

Y下:-1 * 90 + 90 = 0

Y右:0 * 90 + 90 = 90

 

X左:-1 * 90 + 90 = 0

X上:0 * 90 + 90 = 90

X下:0 * 90 + 90 = 90

X右:1 * 90 + 90 = 180

从计算结果中可以得出结论

当Y轴小于90度时,摇杆就处于下半圆

当Y轴小于90度时且X小于90度时为左下:270度 + Y轴旋转角度

当Y轴小于90度时且X大于90度时为右下:180度 + Y轴旋转角度

思路搞定了,开始敲代码,代码不多,我直接贴上来了,看完上诉文字相信你已经知道这些代码是怎么回事了

复制代码
 1     /// 计算摇杆角度 <summary>
 2     /// 计算摇杆角度
 3     /// </summary>
 4     /// <param name="_joyPositionX">摇杆X轴</param>
 5     /// <param name="_joyPositionY">摇杆Y轴</param>
 6     /// <returns>返回当前摇杆旋转多少度</returns>
 7     private float CalculaAngle(float _joyPositionX, float _joyPositionY)
 8     {
 9         float currentAngleX = _joyPositionX * 90f + 90f;//X轴 当前角度
10         float currentAngleY = _joyPositionY * 90f + 90f;//Y轴 当前角度
11 
12         //下半圆
13         if (currentAngleY < 90f)
14         {
15             if (currentAngleX < 90f)
16             {
17                 return 270f + currentAngleY;
18             }
19             else if (currentAngleX > 90f)
20             {
21                 return 180f + (90f - currentAngleY);
22             }
23         }
24         return currentAngleX;
25     }
复制代码

 ok,现在知道当前摇杆旋转了多少度,我们可以轻松的用角度来判断当前移动方向了

用键盘控制时:

A = 左

WA = 左上

W = 上

WD = 右上

D = 右

SD = 右下

S = 下

SA = 左下

 

当摇杆角度为0度,往左

当摇杆角度为90度,往上

当摇杆角度为180度,往右

那我们肯定不能这样写啊,你能确定玩家操作摇杆那么精确啊?

因为我这里控制角色是八方向,所以:360 / 8 = 45

每个方向有45度可触发,那么得出以下解决方案:

上:当前角度 <= 90 + 45 / 2 = 112.5 && 当前角度 >= 90 - 45 / 2 = 67.5

如法炮制,得出以下代码:

复制代码
 1             float currentAngle = CalculaAngle(joyPositionX, joyPositionY);
 2             
 3             if (currentAngle <= 22.5f && currentAngle >= 0f || currentAngle <= 360f && currentAngle >= 337.5f)//0;左
 4                 CurrentDire = "A";
 5             else if (currentAngle <= 67.5f && currentAngle >= 22.5f)//45;左上
 6                 CurrentDire = "WA";
 7             else if (currentAngle <= 112.5f && currentAngle >= 67.5f)//90;上
 8                 CurrentDire = "W";
 9             else if (currentAngle <= 157.5f && currentAngle >= 112.5f)//135;右上
10                 CurrentDire = "WD";
11             else if (currentAngle <= 202.5f && currentAngle >= 157.5f)//180;右
12                 CurrentDire = "D";
13             else if (currentAngle <= 247.5f && currentAngle >= 202.5f)//225;右下
14                 CurrentDire = "SD";
15             else if (currentAngle <= 292.5f && currentAngle >= 247.5f)//270;下
16                 CurrentDire = "S";
17             else if (currentAngle <= 337.5f && currentAngle >= 292.5f)//315;左下
18                 CurrentDire = "SA";
复制代码

大功告成,赶紧发布到手机上跑一下试试,这就是我想要的摇杆八方向操作效果

在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色

后来需要发布到手机上,于是就加了一个摇杆

键盘控制角色的代码已经写好了,角色八方向移动

如果按照传统的大众思路来控制的话,是达不到我想要的效果的,传统控制思路代码如下:

复制代码
 1 //当摇杆处于移动状态时,角色开始奔跑
 2   void OnJoystickMove(MovingJoystick move)
 3   {
 4     if (move.joystickName != "EasyJoystick")
 5     {
 6       return;
 7     }
 8     //获取摇杆偏移量
 9     float joyPositionX = move.joystickAxis.x;
10     float joyPositionY = move.joystickAxis.y;
11     if (joyPositionY != 0 || joyPositionX != 0)
12     {
13       //设置角色的朝向(朝向当前坐标+摇杆偏移量)
14        transform.LookAt(new Vector3(transform.position.x + joyPositionX, transform.position.y, transform.position.z + joyPositionY));
15       //移动玩家的位置(按朝向位置移动)
16       transform.Translate(Vector3.forward * Time.deltaTime * 7.5F);
17       //播放奔跑动画
18       animation.CrossFade("Run");
19     }
20   }
复制代码

 

如果要按照摇杆传统思路控制角色,在重新写控制角色代码的话非常麻烦,所以我就通过计算摇杆旋转角度来判断当前摇杆处于哪个方向

ok,现在我们开始来敲代码

 

首先,我们来调试观察一下摇杆的x轴、y轴的返回值

1     //移动摇杆中  
2     void OnJoystickMove(MovingJoystick move)
3     {
4         Debug.Log(move.joystickAxis.x + "," + move.joystickAxis.y);
5     }


调试结果为:

左:x = -1,y = 0;顺时针旋转X逐渐变大,Y逐渐变大

上:x = 0,y = 1;顺时针旋转X逐渐变大,Y逐渐变小

右:x = 1,y = 0;顺时针旋转X逐渐变小,Y逐渐变小

下:x = 0,y = -1;顺时针旋转X逐渐变小,Y逐渐变大

我们把摇杆底图看成是两个半圆,上半圆和下半圆

那么:

X轴移动到左边时,X = -1;X轴移动到右边时:X = 1;X轴从左转到右旋转了180度

Y轴移动到左边时,Y = 0;Y轴移动到右边时:Y = 0;Y轴从左转到右旋转了180度

 

你如果直接看我的调试结果肯定有点晕,建议边调试边参考我的调试结果,这样才能理解

如果我们要计算当前摇杆在左上角旋转的度数怎么计算呢?

读过小学的人都可以做,只是看见摇杆返回的-1和0脑袋被绕迷糊了,我也一样,弄了好半天才弄好

当摇杆移动到左时,为0度、360度(因为360度为一圈,已经绕回远点了)

当摇杆移动到上时,为90度

当摇杆移动到右时,为180度

当摇杆移动到下时,为270度

既然知道是多少度这就好办多了

得出公式:

当X轴在右时为1,也就是X轴为180度,则:1 * 90 + 90 = 180

当前X轴旋转角度为:X轴返回值 * 90度 + 90度

 

你以为这就完事了吗?还高兴得太早,用这个公式计算只能得到上半圆的旋转角度

现在我们要获取下半圆旋转角度,然后用上半圆旋转角度 + 下半圆旋转角度 = 当前旋转角度

当摇杆移动到下半圆时我们怎么计算旋转角度呢?

我们已经知道Y轴在左边为0,在右边为0,在下边为-1,继续用计算X轴的公式

Y左:0 * 90 + 90 = 90

Y上:1 * 90 + 90 = 180

Y下:-1 * 90 + 90 = 0

Y右:0 * 90 + 90 = 90

 

X左:-1 * 90 + 90 = 0

X上:0 * 90 + 90 = 90

X下:0 * 90 + 90 = 90

X右:1 * 90 + 90 = 180

从计算结果中可以得出结论

当Y轴小于90度时,摇杆就处于下半圆

当Y轴小于90度时且X小于90度时为左下:270度 + Y轴旋转角度

当Y轴小于90度时且X大于90度时为右下:180度 + Y轴旋转角度

思路搞定了,开始敲代码,代码不多,我直接贴上来了,看完上诉文字相信你已经知道这些代码是怎么回事了

复制代码
 1     /// 计算摇杆角度 <summary>
 2     /// 计算摇杆角度
 3     /// </summary>
 4     /// <param name="_joyPositionX">摇杆X轴</param>
 5     /// <param name="_joyPositionY">摇杆Y轴</param>
 6     /// <returns>返回当前摇杆旋转多少度</returns>
 7     private float CalculaAngle(float _joyPositionX, float _joyPositionY)
 8     {
 9         float currentAngleX = _joyPositionX * 90f + 90f;//X轴 当前角度
10         float currentAngleY = _joyPositionY * 90f + 90f;//Y轴 当前角度
11 
12         //下半圆
13         if (currentAngleY < 90f)
14         {
15             if (currentAngleX < 90f)
16             {
17                 return 270f + currentAngleY;
18             }
19             else if (currentAngleX > 90f)
20             {
21                 return 180f + (90f - currentAngleY);
22             }
23         }
24         return currentAngleX;
25     }
复制代码

 ok,现在知道当前摇杆旋转了多少度,我们可以轻松的用角度来判断当前移动方向了

用键盘控制时:

A = 左

WA = 左上

W = 上

WD = 右上

D = 右

SD = 右下

S = 下

SA = 左下

 

当摇杆角度为0度,往左

当摇杆角度为90度,往上

当摇杆角度为180度,往右

那我们肯定不能这样写啊,你能确定玩家操作摇杆那么精确啊?

因为我这里控制角色是八方向,所以:360 / 8 = 45

每个方向有45度可触发,那么得出以下解决方案:

上:当前角度 <= 90 + 45 / 2 = 112.5 && 当前角度 >= 90 - 45 / 2 = 67.5

如法炮制,得出以下代码:

复制代码
 1             float currentAngle = CalculaAngle(joyPositionX, joyPositionY);
 2             
 3             if (currentAngle <= 22.5f && currentAngle >= 0f || currentAngle <= 360f && currentAngle >= 337.5f)//0;左
 4                 CurrentDire = "A";
 5             else if (currentAngle <= 67.5f && currentAngle >= 22.5f)//45;左上
 6                 CurrentDire = "WA";
 7             else if (currentAngle <= 112.5f && currentAngle >= 67.5f)//90;上
 8                 CurrentDire = "W";
 9             else if (currentAngle <= 157.5f && currentAngle >= 112.5f)//135;右上
10                 CurrentDire = "WD";
11             else if (currentAngle <= 202.5f && currentAngle >= 157.5f)//180;右
12                 CurrentDire = "D";
13             else if (currentAngle <= 247.5f && currentAngle >= 202.5f)//225;右下
14                 CurrentDire = "SD";
15             else if (currentAngle <= 292.5f && currentAngle >= 247.5f)//270;下
16                 CurrentDire = "S";
17             else if (currentAngle <= 337.5f && currentAngle >= 292.5f)//315;左下
18                 CurrentDire = "SA";
复制代码

大功告成,赶紧发布到手机上跑一下试试,这就是我想要的摇杆八方向操作效果

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D是一款非常流行的游戏开发引擎,而EasyTouch是一款适用于Unity3D的轻松触控解决方案。EasyTouch可以帮助开发者在Unity3D中实现多种触控操作,例如单指触控、双指缩放、旋转、拖拽等等。 为了下载Unity3D EasyTouch5,您可以按照以下步骤进行操作: 1. 首先,您需要访问Unity3D的官方网站。您可以通过在浏览器中搜索"Unity3D官方网站"来找到它。 2. 在Unity3D官方网站上,您可以找到一个名为"Asset Store"的选项。点击这个选项,您将被带到Unity Asset Store的页面。 3. 在Unity Asset Store的页面上,您可以使用搜索栏来查找EasyTouch5。输入"EasyTouch5"并点击搜索按钮。 4. 您将看到EasyTouch5的搜索结果。点击其中一个结果以查看EasyTouch5的详细信息。 5. 在EasyTouch5的详细信息页面上,您将找到一个名为"Add to My Assets"的按钮。点击这个按钮以将EasyTouch5添加到您的Unity3D项目中。 6. 您将被要求登录到您的Unity账户。如果您尚未创建账户,您需要先创建一个账户以完成登录。 7. 在登录后,您将看到一个名为"Download"的按钮。点击这个按钮以开始下载EasyTouch5。 8. 完成下载后,您可以在Unity3D中导入EasyTouch5。具体的导入步骤可以在Unity的官方文档或EasyTouch的文档中找到。 总的来说,下载Unity3D EasyTouch5非常简单。您只需要访问官方网站,找到并下载EasyTouch5,然后将其导入到您的Unity项目中即可开始使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值