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

1,示图

2、代码例如以下,都有比較具体的凝视。就不说明了。

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

3、demo包,有兴趣的,也能够看看。

下载:

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

  1. 【转】NGUI版虚拟摇杆

    http://blog.csdn.net/anyuanlzh/article/details/40107577 下面是我用nui实现的一个虚拟摇杆. 1,示图 2.代码如下,都有比较详细的注释,就不说 ...

  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. mac常用软件,自用找了很久的分享一下相信很多人需要

    CleanMyMac 3.1.1.dmg比较好用的清理软件.破解版!http://pan.baidu.com/s/1i4mo7jvNTFS读写 Tuxera NTFS for Mac.rar也是破解的 ...

  2. xcode各个版本下载 xcode7 xcode6 xcode5

    登录开发者帐号,选择 support,然后操作如下图: 登录开发者帐号,选择 support,然后操作如下图: 登录开发者帐号,选择 support,然后操作如下图: 登录开发者帐号,选择 suppo ...

  3. 使用 Scene 类在 XNA 中创建不同的场景(八)

    平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...

  4. Linux中 find 常见用法示例

    Linux中find常见用法示例 #find path -option [ -print ] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出 #- ...

  5. 大数据学习——SparkStreaming整合Kafka完成网站点击流实时统计

    1.安装并配置zk 2.安装并配置Kafka 3.启动zk 4.启动Kafka 5.创建topic [root@mini3 kafka]# bin/kafka-console-producer. -- ...

  6. [python IO学习篇] 补充.py文件是中文, .ini文件内容是中文

    python 代码文件的编码.py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character.需要在代 ...

  7. PHP允许AJAX跨域请求的两种方法

    * 一. 服务端设置 header 头允许AJAX跨域 ** 代码如下: // 允许 ityangs.net 发起的跨域请求 header("Access-Control-Allow-Ori ...

  8. 相机拍照功能之权限和Android版本问题

    代码改变世界 相机拍照功能之权限和Android版本问题 对于Android 6.0之前,想要使用系统的相机进行拍照,那么只要在AndroidManifedt.xml中进行添加相应的权限,主要是两个: ...

  9. nginx 变量 + lua

    nginx变量使用方法详解(8) nil.null与ngx.null 发现一个nginx LUA开发Web App的框架 nginx是个好东西, nginx的openrtsy发行版本更是个好东西. 今 ...

  10. scale out instead of scale up

    Scale Out(也就是Scale horizontally)横向扩展,向外扩展Scale Up(也就是Scale vertically)纵向扩展,向上扩展无论是Scale Out,Scale Up ...