UGUI事件监听封装
发表于2017-05-30
在一个游戏项目中,避免不了许多UI组件需要与玩家发生交互。比如:点击,按下,抬起,长按,开始拖拽,拖拽中,拖拽结束,进入UI上方,离开UI上方等,这些都是游戏项目中比较常见的玩家操作。游戏项目中一般都会做一个封装,以便集中处理,做到公用。笔者对常见的UGUI监听事件做了一个基本的封装。依据我的理解,我们游戏项目中,不管是基本的还是特别的UI操作,都是基于Unity引擎本身UGUI系统的基本的相关的API,根据我们游戏项目特殊的要求,做进一步处理而实现。
下面贴出关于UI事件监听的封装类,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using System; /* * Author:LuShang * 对游戏项目中需要交互的UI事件的监听进行封装即UI监听器 * 事件:点击,按下,长按,抬起,停留在UI上方,移出UI上方,拖拽UI等等 */ public class UGUIListener : UnityEngine.EventSystems.EventTrigger { ///
/// 定义委托1:只需传入目标监听UI对象即可 /// /// public delegate void VoidDelegate(GameObject ob); ///
/// 定义委托2:不仅需要传入目标监听UI对象,还需要传更加具体详细的操作数据 /// 一般不常用 /// /// /// public delegate void DelegatePointer(GameObject ob, PointerEventData eventData); ///
/// 声明委托:UI点击事件 /// public VoidDelegate onClick; public DelegatePointer onClickData; ///
/// 声明委托:UI被按下事件 /// public VoidDelegate onDown; public DelegatePointer onDownData; ///
/// 声明委托:UI被按下后又抬起事件 /// public VoidDelegate onUp; public DelegatePointer onUpData; ///
/// 声明委托:进入UI上方事件 /// public VoidDelegate onEnter; public DelegatePointer onEnterData; ///
/// 声明委托:移出UI上方事件 /// public VoidDelegate onExit; public DelegatePointer onExitData; ///
/// 声明委托:长按UI事件 /// public VoidDelegate onLongPress; public DelegatePointer onLongPressData; ///
/// 声明委托:长按UI后抬起事件 /// public VoidDelegate onLongPressUp; public DelegatePointer onLongPressUpData; // 延迟时间 private float delay = 0.5f; // 按钮是否是按下状态 private bool isDown = false ; private bool isHolding = false ; // 按钮最后一次是被按住状态时候的时间 private float lastIsDownTime; private PointerEventData _tmpLongPressEventData; ///
/// 声明委托:关于拖拽UI的:开始拖拽,拖拽中,拖拽结束事件 /// public DelegatePointer onBeginDragData; public DelegatePointer onDragData; public DelegatePointer onEndDragData; //public VoidDelegate onSelect; //public VoidDelegate onUpdateSelect; void Update() { // 如果按钮是被按下状态 if (isDown && !isHolding) { // 当前时间 - 按钮最后一次被按下的时间 > 延迟时间delay秒 if (Time.time - lastIsDownTime > delay) { // 触发长按方法 if (onLongPress != null ) onLongPress(gameObject); if (onLongPressData != null ) onLongPressData(gameObject, _tmpLongPressEventData); // 记录按钮最后一次被按下的时间 lastIsDownTime = Time.time; isHolding = true ; } } } ///
/// UI监听器的构造函数:对UI添加上监听器 /// /// /// static public UGUIListener Get(GameObject ob) { UGUIListener listener = ob.GetComponent if (listener == null ) listener = ob.AddComponent return listener; } ///
/// 注册委托:UI点击事件 /// /// public override void OnPointerClick(PointerEventData eventData) { if (onClick != null ) onClick(gameObject); if (onClickData != null ) onClickData(gameObject, eventData); } ///
/// 注册委托:按下UI事件 /// /// public override void OnPointerDown(PointerEventData eventData) { //设定并记录下按下UI时刻的相关状态信息(为按下UI操作事件,衍生出来的长按UI操作做准备) isDown = true ; lastIsDownTime = Time.time; _tmpLongPressEventData = eventData; if (onDown != null ) onDown(gameObject); if (onDownData != null ) onDownData(gameObject, eventData); } ///
/// 注册委托:进入UI上方事件 /// /// public override void OnPointerEnter(PointerEventData eventData) { if (onEnter != null ) onEnter(gameObject); if (onEnterData != null ) onEnterData(gameObject, eventData); } ///
/// 注册委托:进入UI后又移出UI上方事件 /// /// public override void OnPointerExit(PointerEventData eventData) { if (onExit != null ) onExit(gameObject); if (onExitData != null ) onExitData(gameObject, eventData); } ///
/// 注册委托: /// 1.按下UI后,抬起事件 /// 2.长按UI后,抬起事件 /// /// public override void OnPointerUp(PointerEventData eventData) { if (isDown == true ) { if (onLongPressUp != null ) onLongPressUp(gameObject); if (onLongPressUpData != null ) onLongPressUpData(gameObject, eventData); isDown = false ; isHolding = false ; } if (onUp != null ) onUp(gameObject); if (onUpData != null ) onUpData(gameObject, eventData); } ///
/// 注册委托:开始拖拽UI /// /// public override void OnBeginDrag(PointerEventData eventData) { if (onBeginDragData != null ) onBeginDragData(gameObject, eventData); } ///
/// 注册委托:UI拖拽中 /// /// public override void OnDrag(PointerEventData eventData) { if (onDragData != null ) onDragData(gameObject, eventData); } ///
///注册委托:UI拖拽结束 /// /// public override void OnEndDrag(PointerEventData eventData) { if (onEndDragData != null ) onEndDragData(gameObject, eventData); } //public override void OnSelect(BaseEventData eventData) //{ // if (onSelect != null) onSelect(gameObject); //} //public override void OnUpdateSelected(BaseEventData eventData) //{ // if (onUpdateSelect != null) onUpdateSelect(gameObject); //} } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /* * Autohr:LuShang * 测试UI事件监听器 */ public class Test5 : MonoBehaviour { ///
/// 测试UI /// public GameObject Image; private void Awake() { AddDelegates(); } private void OnDestroy() { RemoveDelegates(); } ///
/// 注册委托 /// void AddDelegates() { UGUIListener.Get(Image).onClick = OnImageClickEvent; } ///
/// 注销委托 /// void RemoveDelegates() { UGUIListener.Get(Image).onClick = null ; } private void OnImageClickEvent(GameObject obj) { Debug.Log( "点击了我!" ); } } |

其他事件,读者可以自行测试验证,这里不就一一测试了。另外,欢迎读者批评指正,相互学习哈。