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. UVA 11990 ``Dynamic'' Inversion (序列分治)

    26天以前做过的一道题,之前的做法是分治预处理,树套树在线修改,复杂度为O(nlogn+m*logn*logn),代码量较大. 本来想学习一下cdq分治的,看到论文上的凸包.斜率就暂时放一边了,只知道 ...

  2. 二叉搜索树(BST)学习笔记

    简介 二叉搜索树(\(Binary\ Search\ Tree\)),简称\(BST\),用于在一个集合中查找元素. 性质 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为 ...

  3. 《剑指offer》【调整数组顺序使奇数位于偶数前面】(python版)

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分 思路: 我认真看了一下,题目应该是要求在原地调整,所以这里不能再 ...

  4. 18课 Vue第一节

    Q1: url-loader必须搭载file-loader?Q2: 图片的打包问题,如果直接写在img标签里用src引用图片,该如何打包?Q3: 如何根据不同的页面html模板打包与之对应的css/j ...

  5. Winform导入Excel数据到数据库

    public partial class ImportExcel : Form { AceessHelpers accessHelper = new AceessHelpers(); public I ...

  6. WinSCP使用与linux命令(小部分命令)

    一.下载一个WinSCP WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件..winscp也可以链接其 ...

  7. c++引用与指针的区别

    c++引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. 指针的权威定义: In a declaration T D where ...

  8. 2019 ACM-ICPC全国邀请赛(西安) M.Travel 二分+判联通

    https://nanti.jisuanke.com/t/39280 讲道理这题写bfs求最大边权限制下从1到n的最短步数,然后二分判一下就行了. 然鹅我还是直接套了dij,一开始纠结dij能不能过, ...

  9. STL MAP使用注意事项

    Hat’s Words A hat’s word is a word in the dictionary that is the concatenation of exactly two other ...

  10. Mysql--7种Join查询

    0.sql的执行顺序 手写顺序 机读顺序 总结 ①From:对from左边的表和右边的表计算笛卡尔积,产生虚拟表c1 ②On:对c1中的数据进行on过滤,只有符合过滤条件的数据记录才会记录在虚拟表c2 ...