http://blog.csdn.net/onafioo/article/details/46403801

http://www.winig.cc/archives/348

好久没有写文章了,最近在做项目是用的unity最新的ui系统UGUI,项目需要做一个摇杆,网上大部分都是用的插件和NGUI做的摇杆,unity自带的摇杆也不怎么好用,而最新的unity4.6.x来了,加入了最新的UI系统“UGUI”,那我们怎么用UGUI来制作摇杆呢~大神勿喷,本人是技术渣渣。

比较出色的摇杆插件《Easy Touch》(很强大)

还是主要讲讲我们自己怎么做。

  1. 首先在unity场景里面新建一个空物体和两个Image,把空物体放在创建Image自动生成的Canvas里面,再把两个Image放在空物体里

    Image建立方式:GameObject->UI->Image   或者直接在“Hierarchy”右键然后UI->Image,看喜好。

    空物体和两个Image的命名看个人喜好。

    威恩的节点是这样的:

    节点中的joystack是刚刚建立的空节点。

    Backgound是摇杆的背景。

    JoystackControl是真实的可以拖动的摇杆。

  2. 把Backgound和JoystackControl的SourceImage替换成自己喜欢的图片,并且把JoystackControl的图片缩小点,这里我就用系统自带的图片了,威恩这两个节点的inspector如下(我修改过得地方用红框标注了,其他都没改):

    最终样子如下:

  3. 那么样子有了就需要让他动起来,需要三个类“EventTriggerListener”、“JoystackCc”、“PlayerMoveControl”。

    EventTriggerListener:在NGUI开发的时候处理事件都会用到UIEventListener,我们已经用的习惯的不得了,而UGUI则不是这种机制,

    并且我觉得这种是最合理的方式,所以自己写一套类似的。

    只是一个帮助类,不需要挂在任何的游戏对象上。

    JoystackCc:这是主要来控制摇杆的。

    挂在JoystackControl节点上

    PlayerMoveControl:这是主要来通过摇杆来控制角色的。

    挂在你想控制的物体上

    直接上代码,写了注释,就不哔哔了。

    EventTriggerListener.cs

    1. using UnityEngine;
    2. using System.Collections;
    3. using UnityEngine.EventSystems;
    4. using System.Collections.Generic;
    5. /// <summary>
    6. /// UGUI事件监听类
    7. /// </summary>
    8. public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger{
    9. publicdelegate void VoidDelegate (GameObject go);
    10. publicdelegate void VectorDelegate(GameObject go, Vector2 delta);
    11. publicVoidDelegate onClick;
    12. publicVoidDelegate onDown;
    13. publicVoidDelegate onEnter;
    14. publicVoidDelegate onExit;
    15. publicVoidDelegate onUp;
    16. publicVoidDelegate onSelect;
    17. publicVoidDelegate onUpdateSelect;
    18. publicVectorDelegate onDrag;
    19. publicVoidDelegate onDragOut;
    20. staticpublic EventTriggerListener Get (GameObject go)
    21. {
    22. if(go==null){
    23. Debug.LogError("EventTriggerListener_go_is_NULL");
    24. return null;
    25. }
    26. else{
    27. EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
    28. if (listener == null) listener = go.AddComponent<EventTriggerListener>();
    29. return listener;
    30. }
    31. }
    32. publicoverride void OnDrag(PointerEventData eventData)
    33. {
    34. if(onDrag != null) onDrag(gameObject, eventData.delta);
    35. }
    36. publicoverride void OnEndDrag(PointerEventData eventData)
    37. {
    38. if(onDragOut != null) onDragOut(gameObject);
    39. }
    40. publicoverride void OnPointerClick(PointerEventData eventData)
    41. {
    42. if(onClick !=null)  onClick(gameObject);
    43. }
    44. publicoverride void OnPointerDown (PointerEventData eventData){
    45. if(onDown !=null) onDown(gameObject);
    46. }
    47. publicoverride void OnPointerEnter (PointerEventData eventData){
    48. if(onEnter !=null) onEnter(gameObject);
    49. }
    50. publicoverride void OnPointerExit (PointerEventData eventData){
    51. if(onExit !=null) onExit(gameObject);
    52. }
    53. publicoverride void OnPointerUp (PointerEventData eventData){
    54. if(onUp !=null) onUp(gameObject);
    55. }
    56. publicoverride void OnSelect (BaseEventData eventData){
    57. if(onSelect !=null) onSelect(gameObject);
    58. }
    59. publicoverride void OnUpdateSelected (BaseEventData eventData){
    60. if(onUpdateSelect !=null) onUpdateSelect(gameObject);
    61. }
    62. }
     
     
  4. JoystackCc.cs

    1. using UnityEngine;
    2. using System.Collections;
    3. public class JoystackCc : MonoBehaviour {
    4. privateVector3 Origin;
    5. Transform mTrans;
    6. privateVector3 _deltaPos;
    7. privatebool _drag = false;
    8. privateVector3 deltaPosition;
    9. floatdis;
    10. [SerializeField]
    11. privatefloat MoveMaxDistance = 80;            //最大拖动距离
    12. [HideInInspector]
    13. publicVector3 FiexdMovePosiNorm; //固定8个角度移动的距离
    14. [HideInInspector]
    15. publicVector3 MovePosiNorm;  //标准化移动的距离
    16. [SerializeField]
    17. privatefloat ActiveMoveDistance = 1;              //激活移动的最低距离
    18. voidAwake()
    19. {
    20. EventTriggerListener.Get(gameObject).onDrag = OnDrag;
    21. EventTriggerListener.Get(gameObject).onDragOut = OnDragOut;
    22. EventTriggerListener.Get(gameObject).onDown = OnMoveStart;
    23. }
    24. // Use this for initialization
    25. voidStart () {
    26. Origin = transform.localPosition;//设置原点
    27. mTrans = transform;
    28. }
    29. // Update is called once per frame
    30. voidUpdate()
    31. {
    32. dis = Vector3.Distance(transform.localPosition, Origin);//拖动距离,这不是最大的拖动距离,是根据触摸位置算出来的
    33. if(dis >= MoveMaxDistance)       //如果大于可拖动的最大距离
    34. {
    35. Vector3 vec = Origin + (transform.localPosition - Origin) * MoveMaxDistance / dis;  //求圆上的一点:(目标点-原点) * 半径/原点到目标点的距离
    36. transform.localPosition = vec;
    37. }
    38. if(Vector3.Distance(transform.localPosition, Origin) > ActiveMoveDistance) //距离大于激活移动的距离
    39. {
    40. MovePosiNorm = (transform.localPosition - Origin).normalized;
    41. MovePosiNorm = new Vector3(MovePosiNorm.x, 0, MovePosiNorm.y);
    42. }
    43. else
    44. MovePosiNorm = Vector3.zero;
    45. }
    46. voidMiouseDown()
    47. {
    48. if((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved))
    49. {
    50. }
    51. else
    52. mTrans.localPosition = Origin;
    53. }
    54. Vector3 result;
    55. privateVector3 _checkPosition(Vector3 movePos, Vector3 _offsetPos)
    56. {
    57. result = movePos + _offsetPos;
    58. returnresult;
    59. }
    60. voidOnDrag(GameObject go, Vector2 delta)
    61. {
    62. if(!_drag)
    63. {
    64. _drag = true;
    65. }
    66. _deltaPos = delta;
    67. mTrans.localPosition +=new Vector3(_deltaPos.x, _deltaPos.y, 0);
    68. }
    69. voidOnDragOut(GameObject go)
    70. {
    71. _drag =false;
    72. mTrans.localPosition = Origin;
    73. if(PlayerMoveControl.moveEnd != null) PlayerMoveControl.moveEnd();
    74. }
    75. voidOnMoveStart(GameObject go)
    76. {
    77. if(PlayerMoveControl.moveStart != null) PlayerMoveControl.moveStart();
    78. }
    79. }
  5.  
     

    PlayerMoveControl.cs

    1. using UnityEngine;
    2. using System.Collections;
    3. public class PlayerMoveControl : MonoBehaviour {
    4. privateTransform _mTransform;
    5. publicJoystackCc _mJoystackCc;
    6. publicfloat moveSpeed = 50;
    7. publicdelegate void MoveDelegate();
    8. publicstatic MoveDelegate moveEnd;
    9. publicstatic MoveDelegate moveStart;
    10. publicstatic PlayerMoveControl Instance;
    11. // Use this for initialization
    12. voidAwake()
    13. {
    14. Instance =this;
    15. _mTransform = transform;
    16. moveEnd = OnMoveEnd;
    17. moveStart = OnMoveStart;
    18. }
    19. voidStart () {
    20. }
    21. voidOnMoveEnd()
    22. {
    23. _turnBase =false;
    24. }
    25. voidOnMoveStart()
    26. {
    27. _turnBase =true;
    28. }
    29. // Update is called once per frame
    30. privatefloat angle;
    31. privatebool _turnBase = false;
    32. voidUpdate()
    33. {
    34. if(_turnBase)
    35. {
    36. Vector3 vecMove = _mJoystackCc.MovePosiNorm*Time.deltaTime*moveSpeed/10;
    37. _mTransform.localPosition+=vecMove;
    38. angle = Mathf.Atan2 (_mJoystackCc.MovePosiNorm.x, _mJoystackCc.MovePosiNorm.z) * Mathf.Rad2Deg - 10;
    39. _mTransform.localRotation = Quaternion.Euler(Vector3.up*angle);
    40. }
    41. }
    42. }
     
     

    建好这三个类之后,把他们绑定到相应的节点上。都挂在哪,代码上面有写

  6. 测试一下,威恩新建了一个cube来作为测试对象,加了个plane作为“伪”地面,太黑了再打个灯….

    下面是测试效果:

如果有任何问题直接留言~尽自己所能帮忙解决~

【转】UGUI实现unity摇杆的更多相关文章

  1. UGUI实现unity摇杆

    http://www.winig.cc/archives/348 好久没有写文章了,最近在做项目是用的unity最新的ui系统UGUI,项目需要做一个摇杆,网上大部分都是用的插件和NGUI做的摇杆,u ...

  2. 【转】Unity3D学习日记(一)使用UGUI制作虚拟摇杆

    http://blog.csdn.net/begonia__z/article/details/51170059 如今手机游戏玩法多种多样,尤其使用虚拟摇杆进行格斗类游戏开发或者是MMORPG成为了主 ...

  3. 用Unity的UGUI实现简单摇杆

    1.在Canvas下新建一个空对象作为我们的摇杆,命名为Joystick. 摇杆由背景和杆两部分组成,所以在Joystick下新建一个Image作为摇杆的背景,命名为BG. 在BG下新建一个Image ...

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

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

  5. 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现

    本文首发蛮牛,次发博客园.接系列 第一篇,第二篇,本文为第三篇,再次感谢“武装三藏”在前两篇无私且精彩的问题解答 写在最前,时光煮雨,为了怀念 以下引用曾今读过的一些教程文章 其实这3种动画都有它特定 ...

  6. unity使用UGUI创建摇杆

    1.现在unity做一个项目,各种插件各种包,于是项目资源就无限变大了,其实一些简单的功能可以自己写,这里就是试着使用UGUI编写一个摇杆功能 2.脚本如下: using UnityEngine; u ...

  7. Unity UGUI RectTransform图解

    UGUI RectTransform.Unity RectTransform详解 The first:look look API. http://docs.unity3d.com/ScriptRefe ...

  8. 【Unity3D基础教程】给初学者看的Unity教程(六):理解Unity的新GUI系统(UGUI)

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! 理解UGUI的基础架构 UGUI是Unity在4 ...

  9. Unity3D_05_理解Unity的新GUI系统(UGUI)

    理解Unity的新GUI系统(UGUI) Unity GUI 链接:UnityEngine.UI系统基础类架构图  Unity GUI 链接:UnityEngine Event & Event ...

随机推荐

  1. 寒假 D3 D Modular Inverse

    Modular Inverse Time Limit: 2 Seconds                                     Memory Limit: 65536 KB     ...

  2. 最短路(Floyd_Warshall) POJ 2240 Arbitrage

    题目传送门 /* 最短路:Floyd模板题 只要把+改为*就ok了,热闹后判断d[i][i]是否大于1 文件输入的ONLINE_JUDGE少写了个_,WA了N遍:) */ #include <c ...

  3. HDU3251 Being a Hero(最小割)

    题目大概一个国家n个城市由m条单向边相连,摧毁每条边都有一个费用.现在你可以选择所给的f个城市中的若干个,每个城市选择后都有一定的价值,但首都1号城市必须到达不了你选择的城市,因为你可能需要摧毁一些边 ...

  4. POJ2186 Popular Cows(强连通分量)

    题目问一个有向图所有点都能达到的点有几个. 先把图的强连通分量缩点,形成一个DAG,那么DAG“尾巴”(出度0的点)所表示的强连通分量就是解,因为前面的部分都能到达尾巴,但如果有多个尾巴那解就是0了, ...

  5. WPF之TextBox

    1. TextBox实现文字垂直居中 TextBox纵向长度比较长但文字字体比较小的时候,在输入时就会发现文字不是垂直居中的. 而使用中我们发现,TextBox虽然可以设置文字的水平对齐方式,但却没有 ...

  6. BZOJ1444 : [Jsoi2009]有趣的游戏

    建立AC自动机,并求出转移矩阵. 再用$\sum E(终止节点)=1$去替换第一个方程,高斯消元即可. 时间复杂度$O(n^3l^3)$. 注意精度问题,要特判0.00的情况. #include< ...

  7. BZOJ3417 : Poi2013 Tales of seafaring

    若x到y走k步可行,那么走k+2步也可行 以每个点为起点,BFS处理出到每个点走了奇数步.偶数步的最短路 对于一次询问,如果d不小于相应奇偶性的最短路,则可行 特判:对于孤立点,无论怎么走都不可行 # ...

  8. 一些比较实用的javascript方法收集,留着有用

    动态加载javascript文件 <script type="text/javascript"> //<!-- /*动态加载方法*/ function loadS ...

  9. How to override create,write,unlink method in Odoo v8

    As we all know, Odoo 8 has new api which is different with v7. So how to override the create,write,u ...

  10. lightning mdb 源代码分析(1)

    lighting mdb(lmdb) 是一个高性能mmap kv数据库,基本介绍和文档参见symas官网,本文将尝试分析其源代码结构以理解数据库设计的关键技术. 本系列文章将尝试从以下几个方面进行分析 ...