UGUI事件监听封装

发表于2017-05-30
评论2 6.5k浏览

     在一个游戏项目中,避免不了许多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("点击了我!");
    }
}
   结果如下:
         
   其他事件,读者可以自行测试验证,这里不就一一测试了。另外,欢迎读者批评指正,相互学习哈。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论