http://blog.csdn.net/begonia__z/article/details/51170059

如今手机游戏玩法多种多样,尤其使用虚拟摇杆进行格斗类游戏开发或者是MMORPG成为了主流的开发方式,可能不少人都会为了制作一个完善的虚拟摇杆感到烦恼,一次又不少人选择使用插件来制作虚拟摇杆。

Momo大神在不久前才写了一篇用UGUI制作虚拟摇杆的,有兴趣的同学可以到这里看看原文,原文地址:http://www.xuanyusong.com/archives/3924

今天刚好公司向里面需要用到这个功能,因此我也研究了一下Momo这篇文章,发现里面有一个算是bug的问题因此我就在Momo大神的代码上进行修改,修复了这个问题而且也添加一下功能方便大家去拓展和使用。

先来看看我和我的小伙伴发现的bug吧。

下图两张图片是Momo大神的写的UGUI虚拟摇杆的小Demo,我们来看看其效果吧:

图片一:

图片二:

比较一下两张图片你会发现有一个致命问题小球的偏移量出问题了,这种情况只出现在虚拟摇杆距离屏幕边距较近的时候会出现这个问题,远离边距的时候就不会出现这个问题了,来看看远离边距时候的效果吧。如下图所示:

这样的限制对于摇杆功能来说并不会有太大的影响,但是UI的设计上还是会出现一些问题和麻烦的。因此我今天就是为了修复这个问题而对UGUI虚拟摇杆进行了研究,花了一点时间进行了bug的修复,然后拓写了它的功能,方便我们来获取摇杆的偏移量来控制人物移动。

先来看看我实现的效果吧,废话不多说上图!

上面的图片可以看出来,虚拟摇杆已经贴着屏幕边框了,但是偏移量并没有减少。

我也不说多少神马了因为实在是太简单了,我就直接上代码吧

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.EventSystems;
  4. using UnityEngine.UI;
  5. public class ScrollCircle :ScrollRect
  6. {
  7. public float recoveryTime = 0.1f;
  8. protected float mRadius;
  9. protected bool isOnEndDrag = false;
  10. protected Vector3 offsetVector3 = Vector3.zero;
  11. void Start()
  12. {
  13. inertia = false;
  14. movementType = MovementType.Unrestricted;
  15. //计算摇杆块的半径
  16. mRadius = (transform as RectTransform).sizeDelta.x * 0.5f;
  17. }
  18. public override void OnScroll(PointerEventData data)
  19. {
  20. }
  21. public override void OnDrag (PointerEventData eventData)
  22. {
  23. base.OnDrag (eventData);
  24. isOnEndDrag = false;
  25. var contentPostion = this.content.anchoredPosition;
  26. if (contentPostion.magnitude > mRadius){
  27. contentPostion = contentPostion.normalized * mRadius ;
  28. SetContentAnchoredPosition(contentPostion);
  29. }
  30. }
  31. public override void OnEndDrag(PointerEventData eventData)
  32. {
  33. base.OnEndDrag(eventData);
  34. if (!isOnEndDrag)
  35. isOnEndDrag = true;
  36. }
  37. void Update()
  38. {
  39. UpdateContent();
  40. }
  41. /// <summary>
  42. /// 摇杆小球复位
  43. /// </summary>
  44. public void UpdateContent()
  45. {
  46. if (isOnEndDrag)
  47. {
  48. if (content.localPosition == Vector3.zero)
  49. isOnEndDrag = false;
  50. float x = Mathf.Lerp(content.localPosition.x, 0.0f, recoveryTime);
  51. float y = Mathf.Lerp(content.localPosition.y, 0.0f, recoveryTime);
  52. content.localPosition = new Vector3(x, y, content.localPosition.z);
  53. }
  54. CalculateOffset();
  55. }
  56. /// <summary>
  57. /// 计算偏移量
  58. /// </summary>
  59. private void CalculateOffset()
  60. {
  61. offsetVector3 = content.localPosition / mRadius;
  62. }
  63. /// <summary>
  64. /// 获取偏移量大小
  65. /// 偏移量范围是[-1,1]
  66. /// </summary>
  67. /// <returns></returns>
  68. public Vector3 GetOffsetVector3()
  69. {
  70. return offsetVector3;
  71. }
  72. }

这里要注意一点,我在start函数里面修改了movementType,如果没有修改movementType参数的同学是没办法实现这个功能的~切记切记!!

最后上一张图片,红框的位置是要特别注意的地方!

今天写了两篇文章好累啊,我会尽量把自己学到研究到的东西都写出来,可能会很乱很杂大家别介意哈....哈哈哈哈~~

【转】Unity3D学习日记(一)使用UGUI制作虚拟摇杆的更多相关文章

  1. 【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机

    http://blog.csdn.net/begonia__z/article/details/51178907 前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控 ...

  2. Unity3d学习日记(五)

      之前用3dsmax将模型转成FBX怎么也没有办法自动导入材质到Unity3d中(试过勾选了导出嵌入媒体,没用).索性试了试c4d,发现是可行的,看来像我这种菜鸡还是更加适合用c4d.   拿zoe ...

  3. Unity3d学习日记(一)

      闲来无事开始自学unity3d,发现还挺容易入门的,添加资源文件以及用c#编写脚本都很方便.   前面在Unity官方教程上自学了一段时间,跟着教程写了个space_shooter的小游戏,虽然游 ...

  4. Unity3d学习日记(六)

      今天在研究怎么在unity中将image上的图片保存到本地,主要参考下面两个链接:Unity Texture2D缩放.UNITY存储图片到本地   结合上述两个链接,我写了如下代码来将缩放后或者改 ...

  5. Unity3d学习日记(四)

      跟着Unity的教程做了两天,做成了一个叫作survivalShooter的游戏,感觉还挺有意思的,做好后我就把它挂到了个人网站上.   如果你在我的网站的主页的话,点击这个图片就能跳到游戏界面. ...

  6. Unity3d学习日记(三)

      使用Application.LoadLevel(Application.loadedLevel);来重新加载游戏scene的方法已经过时了,我们可以使用SceneManager.LoadScene ...

  7. Unity3d学习日记(二)

      跟着教程做让背景可以滚动起来并添加了背景的粒子特效,加入了敌机.   ctrl攻击,↑↓←→移动,Game Over后按R重新开始游戏.   Space Shooter游戏地址:http://ya ...

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

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

  9. unity零基础开始学习做游戏(三)鼠标输入,来个虚拟摇杆怎么样?

    -------小基原创,转载请给我一个面子 现在移动游戏越来越火,大家都拿手机平板玩游戏,没有键盘和手柄输入,所以就不得不看看虚拟摇杆怎么搞?(小基对于没有实体反馈不是很喜欢呢) 首先要清楚,鼠标操作 ...

随机推荐

  1. ubuntu web server ipython notebook install

    http://blog.csdn.net/yehuohan/article/details/51389966 ipython notebook installhttp://blog.csdn.net/ ...

  2. 人品计算器 JFrame 窗体软件版 JPanel JTextField JTextArea JButtton JLabel setContentPane Swing包(用户界面工具包)

    import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.eve ...

  3. c++ 中常量与变量 基本数据类型

    c++中常量如何分类? 1.整数常量,所有的整数. 整数又分为 int (integer) 占用4个字节 一个字节占几个二进制位?8个二进制位,一个整型变量占32位二进制位 (内存中开辟出来的存储空间 ...

  4. Vue 恢复初始值的快速方法

    vue 中经常定义很多data ,在用户进行一些操作后,需要讲data中的某个对象定义为初始值 例如 form: { title: '', describe: '', inspectionCatego ...

  5. pyhon之99乘法表

    1.长方形完整格式 for i in range(1,10): for j in range(1,10): print("%d*%d" %(j,i),end=" &quo ...

  6. 基于js原生封装的点击显示完整文字

    基于js原生封装的点击显示完整文字 (function(window) { var inner = ''; var showCont_s = function(ele) { this.init.app ...

  7. 常见react面试题汇总

    已经开源 地址:https://github.com/nanhupatar...关注我们团队: React 中 keys 的作用是什么? Keys 是 React 用于追踪哪些列表中元素被修改.被添加 ...

  8. 绘制弧形:imagearc() 说明:三点钟的位置是起点(0度

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  9. rpc - 接口返回数据结构的设计

    方案一: 系统级状态  .业务级别的状态同用 code要特殊声明保留状态,如若不声明保留状态,一旦业务开发人员用到了系统级的状态,就有必要侵入的改动业务返回的code(新code与业务欲返回的code ...

  10. JAVA解析XML有哪几种方法?并简述各自的优缺点

    DOM: 是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.是基于信息层次的 优点有:由于树在内存中是持久的,因此可以修改它以 ...