http://blog.csdn.net/anyuanlzh/article/details/40107577

下面是我用nui实现的一个虚拟摇杆。

1,示图

2、代码如下,都有比较详细的注释,就不说明了。

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. [ExecuteInEditMode]
  5. public class Joystick : MonoBehaviour
  6. {
  7. #region Delegate & Event
  8. public delegate void JoystickEventHandler(Joystick joystick);
  9. /// <summary>
  10. /// 开如
  11. /// </summary>
  12. public static event JoystickEventHandler On_JoystickMoveStart;
  13. /// <summary>
  14. /// Occurs when the joystick move.
  15. /// </summary>
  16. public static event JoystickEventHandler On_JoystickMove;
  17. /// <summary>
  18. /// thumb偏离中心位置,并牌按住时,每帧的回调
  19. /// </summary>
  20. public static event JoystickEventHandler On_JoystickHolding;
  21. /// <summary>
  22. /// Occurs when the joystick stops move
  23. /// </summary>
  24. public static event JoystickEventHandler On_JoystickMoveEnd;
  25. #endregion
  26. #region   property
  27. [SerializeField] bool isRunInEditor = false;
  28. [SerializeField]private string joystickName = "NguiJoystick";
  29. public string JoystickName { get { return this.joystickName; } }
  30. [HideInInspector]private bool isLimitInCircle = true;
  31. public bool IsLimitInCircle { get { return this.isLimitInCircle; } }
  32. [SerializeField]private int radius = 100;
  33. public int Radius { get{ return this.radius; } }
  34. [SerializeField]
  35. private float minAlpha = 0.3f;
  36. public float MinAlpha { get { return this.minAlpha; } }
  37. private Vector2 joystickAxis = Vector2.zero;
  38. /// <summary>
  39. /// Gets the joystick axis value between -1 & 1...
  40. /// </summary>
  41. /// <value>
  42. /// The joystick axis.
  43. /// </value>
  44. public Vector2 JoystickAxis { get { return this.joystickAxis; } }
  45. private Vector2 lastJoystickAxis = Vector2.zero;
  46. public Vector2 LastJoystickAxis { get { return this.lastJoystickAxis; } }
  47. bool isForBid = false;
  48. /// <summary>
  49. /// 判断joystick是否被禁用
  50. /// </summary>
  51. public bool IsForBid { get { return this.isForBid; } }
  52. bool isHolding = false;
  53. public bool IsHolding { get { return this.isHolding; } }
  54. #endregion
  55. UIWidget root;
  56. [SerializeField]UISprite bg;
  57. [SerializeField]UISprite thumb;
  58. void Awake()
  59. {
  60. this.name = this.JoystickName;
  61. root = this.GetComponent<UIWidget>();
  62. Init();
  63. }
  64. // Update is called once per frame
  65. void Update ()
  66. {
  67. if (isRunInEditor && Application.isEditor && !Application.isPlaying)
  68. {
  69. SetJoystickSize(radius);
  70. }
  71. if (!isForBid && isHolding)
  72. {
  73. Debug.Log("111111");
  74. if (On_JoystickHolding != null)
  75. {
  76. On_JoystickHolding(this);
  77. }
  78. }
  79. }
  80. void Init()
  81. {
  82. bg.transform.localPosition = Vector3.zero;
  83. thumb.transform.localPosition = Vector3.zero;
  84. SetJoystickSize(radius);
  85. Lighting(minAlpha);
  86. }
  87. #region ngui event
  88. ///// <summary>
  89. ///// test
  90. ///// </summary>
  91. //void OnClick ()
  92. //{
  93. //    Debug.Log("mouse pos :" + Input.mousePosition + " -- touch pos :" + ScreenPos_to_NGUIPos(Input.mousePosition));
  94. //    thumb.transform.localPosition = ScreenPos_to_NGUIPos(Input.mousePosition);
  95. //}
  96. void OnPress (bool isPressed)
  97. {
  98. if (isForBid)
  99. {
  100. Debug.Log("joystick is forbid!");
  101. return;
  102. }
  103. Debug.Log("OnPress:" + isPressed.ToString());
  104. if(isPressed)
  105. {
  106. Lighting(1f);
  107. CalculateJoystickAxis();
  108. if (On_JoystickMoveStart != null)
  109. {
  110. On_JoystickMoveStart(this);
  111. }
  112. isHolding = true;
  113. }
  114. else
  115. {
  116. CalculateJoystickAxis();
  117. if (On_JoystickMoveEnd != null)
  118. {
  119. On_JoystickMoveEnd(this);
  120. }
  121. thumb.transform.localPosition = Vector3.zero;
  122. FadeOut(1f, minAlpha);
  123. isHolding = false;
  124. }
  125. }
  126. //void OnDragStart ()
  127. //{
  128. //    if (isForBid)
  129. //    {
  130. //        Debug.Log("joystick is forbid!");
  131. //        return;
  132. //    }
  133. //    Debug.Log("OnDragStart");
  134. //    Lighting(1f);
  135. //    CalculateJoystickAxis();
  136. //    if(On_JoystickMoveStart!=null)
  137. //    {
  138. //        On_JoystickMoveStart(this);
  139. //    }
  140. //    isHolding = true;
  141. //    Debug.Log(string.Format("time:{0} - axis:{1}", Time.time, joystickAxis));
  142. //}
  143. void OnDrag(Vector2 delta)
  144. {
  145. if (isForBid)
  146. {
  147. return;
  148. }
  149. //Debug.Log("OnDrag:"+delta.ToString());
  150. CalculateJoystickAxis();
  151. if (On_JoystickMoveStart != null)
  152. {
  153. On_JoystickMoveStart(this);
  154. }
  155. }
  156. //void OnDragEnd ()
  157. //{
  158. //    if (isForBid)
  159. //    {
  160. //        return;
  161. //    }
  162. //    Debug.Log("OnDragEnd");
  163. //    CalculateJoystickAxis();
  164. //    if (On_JoystickMoveEnd != null)
  165. //    {
  166. //        On_JoystickMoveEnd(this);
  167. //    }
  168. //    thumb.transform.localPosition = Vector3.zero;
  169. //    FadeOut(1f, minAlpha);
  170. //    isHolding = false;
  171. //}
  172. #endregion
  173. #region utile
  174. /// <summary>
  175. /// 计算JoystickAxis
  176. /// </summary>
  177. /// <returns></returns>
  178. void CalculateJoystickAxis()
  179. {
  180. Vector3 offset = ScreenPos_to_NGUIPos(UICamera.currentTouch.pos);
  181. offset -= transform.localPosition;
  182. if (isLimitInCircle)
  183. {
  184. if (offset.magnitude > radius)
  185. {
  186. offset = offset.normalized * radius;
  187. }
  188. }
  189. thumb.transform.localPosition = offset;
  190. lastJoystickAxis = joystickAxis;
  191. joystickAxis = new Vector2(offset.x / radius, offset.y / radius);
  192. }
  193. /// <summary>
  194. /// Axis2s the angle.
  195. /// </summary>
  196. /// <returns>
  197. /// The angle.
  198. /// </returns>
  199. public float Axis2Angle(bool inDegree = true)
  200. {
  201. float angle = Mathf.Atan2(joystickAxis.x, joystickAxis.y);
  202. if (inDegree)
  203. {
  204. return angle * Mathf.Rad2Deg;
  205. }
  206. else
  207. {
  208. return angle;
  209. }
  210. }
  211. /// <summary>
  212. /// Axis2s the angle.
  213. /// </summary>
  214. /// <returns>
  215. /// The angle.
  216. /// </returns>
  217. public float Axis2Angle(Vector2 axis, bool inDegree = true)
  218. {
  219. float angle = Mathf.Atan2(axis.x, axis.y);
  220. if (inDegree)
  221. {
  222. return angle * Mathf.Rad2Deg;
  223. }
  224. else
  225. {
  226. return angle;
  227. }
  228. }
  229. /// <summary>
  230. /// 屏幕坐标-->ui坐标
  231. /// </summary>
  232. /// <param name="screenPos"></param>
  233. /// <returns></returns>
  234. Vector3 ScreenPos_to_NGUIPos(Vector3 screenPos)
  235. {
  236. Vector3 uiPos = UICamera.currentCamera.ScreenToWorldPoint(screenPos);
  237. uiPos = UICamera.currentCamera.transform.InverseTransformPoint(uiPos);
  238. return uiPos;
  239. }
  240. /// <summary>
  241. /// 屏幕坐标-->ngui坐标
  242. /// </summary>
  243. /// <param name="screenPos"></param>
  244. /// <returns></returns>
  245. Vector3 ScreenPos_to_NGUIPos(Vector2 screenPos)
  246. {
  247. return ScreenPos_to_NGUIPos(new Vector3(screenPos.x, screenPos.y, 0f));
  248. }
  249. /// <summary>
  250. /// 设置摇杆的大小
  251. /// </summary>
  252. /// <param name="radius"></param>
  253. void SetJoystickSize(int radius)
  254. {
  255. root.width = 2 * radius;
  256. root.height = 2 * radius;
  257. thumb.width = (int)(40f / 100f * root.width);
  258. thumb.height = (int)(40f / 100f * root.height);
  259. }
  260. /// <summary>
  261. /// 点亮摇杆
  262. /// </summary>
  263. void Lighting(float alpha)
  264. {
  265. iTween.Stop(this.gameObject, "value");
  266. root.alpha = alpha;
  267. }
  268. /// <summary>
  269. /// 渐变摇杆的透明度
  270. /// </summary>
  271. void FadeOut(float fromAlpha, float toAlpha)
  272. {
  273. Hashtable itweenArgs = new Hashtable();
  274. itweenArgs.Add("easetype", iTween.EaseType.linear);
  275. itweenArgs.Add("from", fromAlpha);
  276. itweenArgs.Add("to", toAlpha);
  277. itweenArgs.Add("time", 0.5f);
  278. itweenArgs.Add("onupdate", "OnFadeOutTween");
  279. iTween.ValueTo(this.gameObject, itweenArgs);
  280. }
  281. void OnFadeOutTween(float value)
  282. {
  283. root.alpha = value;
  284. }
  285. #endregion
  286. #region 激活、禁用的控制
  287. List<string> keys = new List<string>();
  288. /// <summary>
  289. /// 禁用
  290. /// </summary>
  291. /// <returns>返回值是,取消这个禁用要用到的key</returns>
  292. public string ForbidJosystick()
  293. {
  294. string key = System.Guid.NewGuid().ToString();
  295. keys.Add(key);
  296. isForBid = true;
  297. return key;
  298. }
  299. /// <summary>
  300. /// 启用
  301. /// </summary>
  302. /// <param name="key"></param>
  303. public void ActivizeJosystick(string key)
  304. {
  305. if(keys.Contains(key))
  306. {
  307. keys.Remove(key);
  308. }
  309. isForBid = true;
  310. if(keys.Count==0)
  311. {
  312. isForBid = false;
  313. }
  314. }
  315. #endregion
  316. }

3、demo包,有兴趣的,也可以看看。

下载:

 
 

【转】NGUI版虚拟摇杆的更多相关文章

  1. NGUI版虚拟摇杆

    以下是我用nui实现的一个虚拟摇杆. 1,示图 2.代码例如以下,都有比較具体的凝视.就不说明了. using UnityEngine; using System.Collections; using ...

  2. 【转】简单的虚拟摇杆控制移动(NGUI)

    http://www.cnblogs.com/zhangbaochong/p/4928688.html 一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个B ...

  3. 简单的虚拟摇杆控制移动(NGUI)

    一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个BoxCollider,再创建一个sprite child作为虚拟摇杆中间的按钮,叫做button 二.通 ...

  4. unity中虚拟摇杆的实现

    实现效果: 实现: 使用NGUI添加虚拟摇杆背景和其子物体按钮,为按钮Attach  boxcollider和ButtionScript.为按钮添加如下脚本: 注意:其中的静态属性可以在控制物体移动的 ...

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

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

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

    Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆 效果如图所示 摇杆的UI组成 如图所示 简单的可以认为摇杆由1.2.3贴图组成 为摇杆的底座 为摇杆的杆 为摇杆的指向 可以理解这就是街机上的 ...

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

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

  8. [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动

    大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei.今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动.虽然Un ...

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

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

随机推荐

  1. yum与rpm的使用

    rpm常用的命令组合: rpm -ivh:安装显示安装进度--install--verbose--hash -Uvh:升级软件包--Update: -qpl:列出RPM软件包内的文件信息[Query ...

  2. VMware-WorkStation 序列号(转)

    原文摘自: http://blog.csdn.net/twlkyao/article/details/8681927 最近升级了下虚拟机,可是还要序列号,网上找了几个可以用的,留着,备用. 9.0.2 ...

  3. WebService站点服务的地址

    天气的地址 http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx

  4. 【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****

    [codevs2216]行星序列 2014年2月22日3501 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小 ...

  5. kinect学习笔记(四)——各种数据流

    一.kinect开发的一个流程图 1.我们可以知道一个简单的框架就是几部分 (1)选择使用的kinect传感器 KinectSensor.KinectSensors[] (2)打开需要的数据流 _ki ...

  6. Burpsuite教程与技巧之HTTP brute暴力破解

    Burpsuite教程与技巧之HTTP brute暴力破解 Gall @ WEB安全 2013-02-28 共 19052 人围观,发现 32 个不明物体收藏该文 感谢Gall投递 常规的对usern ...

  7. html 绘制图像

  8. SGU438 The Glorious Karlutka River =)(最大流)

    题目大概说有m个人要过一条宽W的河,人最远跳远距离是d,河上有n个垃圾堆,每个垃圾堆都有坐标和同一时间能容纳的人数,问所有人最少要跳几次才能跳到对岸. 又是一题根据时间拆点的最大流. 二分时间建容量网 ...

  9. CSS光标属性一览表

    光标类型 CSS 把你的光标放到相应文字上查看效果 要注意光标的实际效果依赖于用户的系统设置,与你在这里看到的效果并不一定一致. 十字准心 cursor: crosshair; 手 cursor: p ...

  10. 新浪微博iOS客户端架构与优化之路

    新浪微博iOS客户端架构与优化之路   随着Facebook.Twitter.微博的崛起,向UGC.PGC.OGC,自媒体提供平台的内 容消费型App逐渐形成了独特的客户端架构模式.与电商和通讯工具类 ...