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. env

    shell环境变量以及set,env,export的区别 原文链接 一.shell环境变量的分类以及set env export的区别: set:显示(设置)shell变量 包括的私有变量以及用户变量 ...

  2. Xamarin.iOS项目编译提示Could not AOT the assembly

    Xamarin.iOS项目编译提示Could not AOT the assembly 错误信息:Could not AOT the assembly **************.dll 这个错误是 ...

  3. 万网云解析设置二级域名解析到同IP不同端口

    http://jingyan.baidu.com/article/eb9f7b6d8a02a5869364e827.html

  4. AngularJS学习笔记二:AngularJS指令

    AngularJS 指令: AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. 几个常用 指令: ng-app 指令 ...

  5. HDU4862 Jump(放大边权的费用流)

    题目大概给一个n×m的格子,每个格子有一个一位数字,格子不能重复经过,最多进行这样的k次行走:每一次选择任意一个格子出发,可以从当前格子走到下面或右边格子,花费能量是曼哈顿距离-1,而如果起点和终点格 ...

  6. BZOJ1769 : [Ceoi2009]tri

    将所有点极角排序,建立线段树,线段树每个节点维护该区间内所有点组成的上下凸壳. 对于一个查询,二分查找出相应区间的左右端点,在线段树上得到$O(\log n)$个节点,在相应凸壳上三分查找出与斜边叉积 ...

  7. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  8. 【TYVJ】1307 联络员(最小生成树)

    http://tyvj.cn/Problem_Show.aspx?id=1307 kruskal裸题.(水题红色警报) #include <cstdio> #include <cst ...

  9. Mina工具类v1.5

    package com.cucpay.fundswap.util; import java.net.InetSocketAddress; import java.nio.charset.Charset ...

  10. Spring Aop实例

    一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspe ...