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. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...

  2. Mybatis-延迟加载和缓存

    延迟加载 概念: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表 ...

  3. 2018.5.20 oracle强化练习

    --现在有一个商店的数据库,记录客户以及购物的情况, 商品表goods (商品号 goodsid varchar2(8) 商品名 goodsname varchar2(20) 单价 unitprice ...

  4. C#继承机制 多级继承

    一些面向对象语言允许一个类从多个基类中继承,而另一些面向对象语言只允许从一个类继承,但可以随意从几个接口或纯抽象类中继承. 只有C++支持多级继承,许多程序员对此褒贬不一.多级继承常会引起继承来的类之 ...

  5. windows下sorl安装

    1. JDK要求 Solr 4.10 要求JDK版本必须是1.7或更高. 2. 下载 下载地址: http://www.apache.org/dyn/closer.cgi/lucene/solr/ 下 ...

  6. java基础面试题:抽象类中是否可以有静态的main方法?

  7. caller、callee的用法及区别

    1 :caller 返回一个调用当前函数的引用 如果是由顶层调用的话 则返回null (举个栗子哈 caller给你打电话的人  谁给你打电话了 谁调用了你 很显然是下面a函数的执行 只有在打电话的时 ...

  8. 二十九、MySQL 序列使用

    MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍 ...

  9. Spring中的单例模式和多例模式的应用

    在Spring的配置中,Bean的scope属性中存在两种模式:singleton(单例模式).prototype(多例模式) singleton 单例模式:对象在整个系统中只有一份,所有的请求都用一 ...

  10. sed速查手册

    1. Sed简介sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后, ...