在写第三人称控制的时候,一开始在电脑测试是用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 != || joyPositionX != )
  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";

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

原文链接:http://www.cnblogs.com/shenggege/p/4115574.html

unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色的更多相关文章

  1. 【Cocos2d-Js实战教学(1)横版摇杆八方向移动】

    本教程主要通过搭建一个横版摇杆八方向移动的实例,让大家如何用Cocos2dx-Js来做一款游戏,从基础了解Cocos2dx-Js的基本实现原理,从创建工程,到各个知识点的梳理. 教程分为上下两讲: 上 ...

  2. unity3d easytouch教程

    http://www.taikr.com/group/6/thread/1987 说一说easytouch的简单使用方法,和移动平台上的rpg游戏一样,我们肯定也不陌生,我们经常玩游戏的时候用的都是虚 ...

  3. CocosCreator游戏开发(四)实现摇杆控制角色功能

    时隔3年,我又开始继续写这个系列的帖子了,也不知道是会写完全系列,还是再次夭折. 废话不多.直接开始主题了 主要实现的功能点包含这些内容:通过摇杆控制角色进行八方位移动,并按照各方位播放对应移动动画 ...

  4. (转)[unity3d]easytouch的使用

    对于移动平台上的RPG类的游戏,我们常用虚拟摇杆来控制人物角色的行走和一些行为,相信我们对它并不陌生,之前尝试了EasyTouch2.5,发现并没有最新版的3.1好用,2.5版本的对于自适应没有做的很 ...

  5. GameUnity 2.0 文档(三) 纸片人八方向

    DirectSprite类 有别于 上篇文档出现的 AnimationSprite类 (从头播放到尾) 这个类根据 path的图,如果是 8*8 64个图 八方向,可以设置长宽和 角度 角度 代表 8 ...

  6. 一个高效的A-star寻路算法(八方向)(

    这种写法比较垃圾,表现在每次搜索一个点要遍历整个地图那么大的数组,如果地图为256*256,每次搜索都要执行65535次,如果遍历多个点就是n*65535,速度上实在是太垃圾了 简单说下思路,以后补充 ...

  7. 使用GML的八方向自动寻路

    使用GML的八方向自动寻路 本教程适合无基础人员使用. 提示 本教程中仅使用了最简单的方法,并且有一些错误和不规范之处.请谅解一下,在评论区提出,我会修改.古人曰"教学相长",希望 ...

  8. 【转载】Unity3D研究院之IOS自定义游戏摇杆与飞机平滑的移动

    移动开发游戏中使用到的触摸游戏摇杆在iPhone上是非常普遍的,毕竟是全触摸屏手机,今天MOMO 通过一个小例子和大家讨论Unity3D 中如何自定义一个漂亮的全触摸游戏摇杆.        值得高兴 ...

  9. 【Unity3D】计算二维向量夹角(-180到180)

    在Unity3D中,有时候我们需要计算二维向量的夹角.二维向量夹角一般在0~180度之前,可以直接调用Vector2.Angle(Vector2 from, Vector2 to)来计算. 但是在有些 ...

随机推荐

  1. 使用ParseExact方法将字符串转换为日期格式

    实现效果: 知识运用: DateTime结构的ParseExact方法 public static DateTime ParseExact(string s,string format,IFormat ...

  2. Python Notes | Python 备忘笔记

    [ File IO ] parameters used in the file IO: 该参数决定了打开文件的模式:只读,写入,追加等.所有可取值见如下的完全列表.这个参数是非强制的,默认文件访问模式 ...

  3. C# DataSet.Designer.cs

    今天在做项目的时候,发现一个很奇葩的问题,VS 中DataSet数据集的问题Dataset数据集更新,在保存后原有的Dataset.Designer.cs不变,又增加一个新的Dataset1.Desi ...

  4. LeetCode17.电话号码的字母组合 JavaScript

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  5. MySQL数据库操作基础

    .MySQL 是什么? )软件(Software):工具(解决问题) )数据库管理系统(DBMS) )关系型(Relation)数据库管理系统(RDBMS):类似Oracle 扩展:db-engine ...

  6. 搭建一个java开发环境的步骤

    首先思考java开发环境需要些什么? 1.适用于我们开发环境的jdk 2.对应开发环境的IDE 3.如果是web应用,还需要web服务器,常用的有Tomcat 1) 下载对应组件 2) 安装 jdk安 ...

  7. Mybatis中使用UpdateProvider注解实现根据主键批量更新

    Mapper中这样写: @UpdateProvider(type = SjjcSqlProvider.class, method = "updateTaskStatusByCBh" ...

  8. 小B的询问(莫队)

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...

  9. 【TOJ 3692】紧急援救

    #include<iostream> #include<algorithm> #include<queue> using namespace std; #defin ...

  10. 最大的最大公约数( 51nod-1179)

    妈耶有日期显示啊,我还写什么... 给出N个正整数,找出N个数两两之间最大公约数的最大值. 例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5.   ...