Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆

效果如图所示


摇杆的UI组成

如图所示 简单的可以认为摇杆由1、2、3贴图组成

  1. 为摇杆的底座
  2. 为摇杆的
  3. 为摇杆的指向

可以理解这就是街机上的摇杆


详解---摇杆显示规则

如图所示

  • 最外面绿色的矩形为可点击区域
  • 黑色矩形为摇杆的显示区域
  1. 摇杆在操作结束后会回到抬起位置(如图状态)

  2. 摇杆的可点击区域有限制(如图绿色框)

  3. 摇杆的显示区域有限制(如图黑色框 作用:防止摇杆一半在屏幕外 )

  4. 摇杆的中心位置随点击位置改变(如果在显示区域外则取临界值

更据上面的规则定义public变量可以方便策划大佬运行状态随时修改


详解---操作摇杆的几种动作、状态

首先我们把摇杆系统分解成状态、动作

  • 闲置(状态)
  • 按下(动作)
  • 抬起(动作)
  • 准备(状态)
  • 拖动(状态)

动作、状态区别重点

  • 动作:一旦执行完毕就结束了(调用一次
  • 状态:如果没有外部条件的触发,一个状态会一直持续下去(不停的调用

  • 闲置---状态

    • 不需要做任何处理

  • 按下---动作(手指按下屏幕 触发)

    • 获取手指按下坐标
    • 设置摇杆的位置(如左图)
    • 如果坐标在显示区域外,则取临界值(如右图)
    • UI、特效的显示或隐藏

  • 抬起---动作(手指离开屏幕 触发)

    • 摇杆回到抬起位置
    • UI、特效的显示或隐藏

  • 准备---状态(手指按下屏幕动作完成 触发)

    • 获取手指的实时坐标
    • 如果实时坐标按下坐标的距离大于设定值则切换到拖动状态
    • UI、特效的显示或隐藏

  • 拖动---状态(手指滑动 触发)

    • 获取手指的实时坐标
    • 获取实时坐标与摇杆的坐标的距离P
    • 设置杆的位置
      • 如果杆的位置超过可拖动的最大值则取最大值
  • 设置指向的位置
    • 如果距离P大于显示指向最小值则显示指向同时
    • 否则隐藏指向

这些动作、状态是我边测试边写代码总结出来的

使用枚举定义摇杆的几种状态、动作

可源代码中找到对应的方法


详解---几种状态、动作之间切换

  • 手指按下切换到---按下动作

  • 手指抬起切换到---抬起动作

  • 按下动作执行完成切换到---准备状态

  • 准备状态达成条件切换到---拖动状态



使用到的API和方法

如果你理解了摇杆系统,但遇到了一些技术上的问题,下面的方法可能帮助你

  • 计算两个坐标的距离
        float distance = Vector3.Distance(Vec0, Vec1);
  • 获取手指按下位置
        Vector3 mousePosition = UICamera.currentTouch.pos;
  • 计算手指按下相对于摇杆的位置
        //转换为世界坐标
mousePosition = UICamera.currentCamera.ScreenToWorldPoint(mousePosition);
//转换为本地坐标
mousePosition = transform.InverseTransformPoint(mousePosition);
  • 设置摇杆指向的角度
        //mouseLocalPosition手指按下相对于摇杆的坐标
//background摇杆
//direction指向
Double angle = Math.Atan2((mouseLocalPosition.y - background.localPosition.y), (mouseLocalPosition.x - background.localPosition.x)) * 180 / Math.PI;
//设置摇杆指向的角度
direction.eulerAngles = new Vector3(0, 0, (float)angle);

如果有更好的办法 求大佬赐教


老规矩工程链接:https://github.com/QiangZou/Joystick

UI、适配由NGUI实现,需要导入NGUI到工程中(NGUI有点大,没上传)

Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆的更多相关文章

  1. Unity 使用 陀螺仪 实现 《王者荣耀》 登入界面 背景动态效果

    在 <王者荣耀> 登入界面 左右上下晃动手机(有些手机不支持)可以看到背景在变化 我使用的是iPhone SE 效果如下: 对比两张图片的左下角 可以看到差异 至于为什么要这么做: 1.使 ...

  2. Unity3d项目入门之虚拟摇杆

    Unity本身不提供摇杆的组件,开发者可以使用牛逼的EasyTouch插件或者应用NGUI实现相关的需求,下面本文通过Unity自身的UGUI属性,实现虚拟摇杆的功能. 主参考 <Unity:使 ...

  3. Unity制作王者荣耀商业级手游

    <王者荣耀>这种现象级手机游戏是如何制作出来的呢?本文以<王者荣耀>MOBO类型的多人在线战术竞技游戏为入口,覆盖Unity游戏制作开发前端与Node.js服务器端的开发必备知 ...

  4. 《王者荣耀》技术总监复盘回炉历程:没跨过这三座大山,就是另一款MOBA霸占市场了

    如今已经大获市场成功的<王者荣耀>一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前,也遇到过一段鲜有人知的调优期.也就是在2015年8月18号正式不删档测试版本推出之后, ...

  5. 【转】《王者荣耀》技术总监复盘回炉历程:没跨过这三座大山,就是另一款MOBA霸占市场了

    如今已经大获市场成功的<王者荣耀>一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前,也遇到过一段鲜有人知的调优期.也就是在2015年8月18号正式不删档测试版本推出之后, ...

  6. 王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍

    在国内,如果你没有听说过<王者荣耀>,那你一定是古董级的人物了. <王者荣耀>(以下简称“农药”),专注于移动端(Android.IOS)的MOBA游戏.笔者看到这么火爆,就萌 ...

  7. 基于NABCD评论作业-王者荣耀交流协会PSP DAILY

    一.根据(不限于)NABCD评论作品的选题   N(Need,需求):在我知道PSP DAILY这款软件的时候,就认为这款软件对于学习软件工程课的学生来说有很大的需要.对于需求来说,软件工程课程中的学 ...

  8. [0]尝试用Unity3d制作一个王者荣耀(持续更新)->游戏规划

    太得闲了于是想写个农药,虽然可能会失败但是还是要试一试. 因为是自学的不是Unity专业的可能表达语言会有些不标准!望见谅! 结构: 以组件式(比如说摇杆控制和玩家部分的编写是分离的,可以自由拼装)作 ...

  9. 当会打王者荣耀的AI学会踢足球,一不小心拿下世界冠军!

    难得的元旦小假期,没有什么比得上在慵懒的冬日艳阳下放松自己,拿起手机,叫上了许久未一起作战的小伙伴,到王者荣耀中激战了一番,仿佛又回到了当年那个年轻的自己. 厉害不,毕竟当年DD也是王者五十星的水平, ...

随机推荐

  1. Find one unique integer

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  2. Devexpress VCL Build v2014 vol 14.2.4 发布

    What's New in 14.2.4 (VCL Product Line)   New Major Features in 14.2 What's New in VCL Products 14.2 ...

  3. 前端之css笔记3

    一 display属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  4. hdu-2191(完全背包+二进制优化模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路:完全背包模板 #include<iostream> #include<c ...

  5. DB2 runstats、reorgchk、reorg 命令【转载】

    1.runstats runsats可以搜集表的信息,也可以搜集索引信息.作为runstats本身没有优化的功能,但是它更新了统计信息以后,可以让DB2优化器使用最新的统计信息来进行优化,这样优化的效 ...

  6. update 操作用法

    --update 这个字段的所值为2 update tab a set a.字段1=2; --带条件的update update tab a set a.字段1=2 where id=10000; - ...

  7. Java Toolkit类用法

    这是一个AWT工具箱.它提供对本地GUI最低层次的JAVA访问.在大多情况下,这个类不直接用在小应用程序或应用程序中.具有把行图形数据转换为可显示的图像.返回字体信息.得出显示尺寸和分辨率以及获得系统 ...

  8. java thrift返回List异常

    对于下段代码: public List<String> hmget(String key, List<String> fields) throws org.apache.thr ...

  9. 使用OpenCV进行相机标定

    1. 使用OpenCV进行标定 相机已经有很长一段历史了.但是,伴随着20世纪后期的廉价针孔照相机的问世,它们已经变成我们日常生活的一种常见的存在.不幸的是,这种廉价是由代价的:显著的变形.幸运的是, ...

  10. Linux C 创建目录函数mkdir相关【转】

    转自:http://blog.csdn.net/fallenink/article/details/8480483 原文地址:http://sharp2wing.iteye.com/blog/1280 ...