UGUI中的事件系統

1.UGUI中支持的事件

MSDN鏈接:https://docs.unity3d.com/Manual/SupportedEvents.html

參考博文http://blog.csdn.net/lyh916/article/details/44570503


2. 實現事件有兩種方式:

a).編輯器:添加EventTrigger組件

b).代碼:繼承EventTrigger實現所需要的事件

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class CubeState :  EventTrigger{
 
    //====================================================================================
    //其它系列:
    //OnSubmit、OnCancel、OnDrop、OnMove、OnScroll
    //====================================================================================
 
    //PC平臺下按Enter鍵
    public override void OnSubmit(BaseEventData eventData)
    {
        Debug.Log("調用OnSubmit...");
    }
 
    //PC平臺下按ESC鍵
    public override void OnCancel(BaseEventData eventData)
    {
        Debug.Log("調用OnCancel...");
    }
 
    //鼠標鬆開時
    public override void OnDrop(PointerEventData eventData)
    {
        Debug.Log("調用OnDrop...");
    }
 
    //物體在移動時(未測試)
    public override void OnMove(AxisEventData eventData)
    {
        Debug.Log("調用OnMove...");
    }
 
    //鼠標滾輪滾動的時候(未測試)
    public override void OnScroll(PointerEventData eventData)
    {
        Debug.Log("調用OnScroll...");
    }
 
 
 
    //====================================================================================
    //Select系列:
    //OnSelect、OnUpdateSelected、OnDeselect
    //====================================================================================
 
    //當被選中的時候調用一次
    public override void OnSelect(BaseEventData eventData)
    {
        Debug.Log("調用OnSelect...");
    }
 
    //在選中的時候每幀都會被調用
    public override void OnUpdateSelected(BaseEventData eventData)
    {
        //Debug.Log("調用OnUpdateSelected...");
    }
 
    //物體從選中狀態到取消選中狀態時會被調用
    public override void OnDeselect(BaseEventData eventData)
    {
        Debug.Log("調用OnDeselect...");
    }
 
    //====================================================================================
    //Pointer系列:
    //執行先後順序:
    //OnPointerDown>OnPointerEnter>OnPointerClick>OnPointerUp>OnPointerExit
    //====================================================================================
 
    //初始化拖拽時
    public override void OnInitializePotentialDrag(PointerEventData eventData)
    {
        Debug.Log("調用OnInitializePotentialDrag...");
    }
 
    //指針剛開始點擊之後點擊之後第一時間時
    public override void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("調用OnPointerEnter...");
    }
 
    //在同一個物體上點擊
    public override void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("調用OnPointerClick...");
    }
 
    //鼠標擡起
    public override void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("調用OnPointerUp...");
    }
 
    //鼠標按下
    public override void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("調用OnPointerDown...");
    }
 
    //結束的時候
    public override void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("調用OnPointerExit...");
    }
 
    //====================================================================================
    //拖拽系列:
    //OnBeginDrag、OnDrag、OnEndDrag
    //====================================================================================
 
    //開始拖拽
    public override void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("調用OnBeginDrag...");
        //Debug.Log("pointerPress:"+eventData.pointerPress);
        //Debug.Log("pressPosition;" + eventData.pressPosition);
        ChangePositionByDrag(eventData);
    }
 
    //拖拽過程中
    public override void OnDrag(PointerEventData eventData)
    {
        //Debug.Log("調用OnDrag...");
        ChangePositionByDrag(eventData);
    }
 
    //結束拖拽
    public override void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("調用OnEndDrag...");
        ChangePositionByDrag(eventData);
    }
 
 
 
    //拖過拖拽變更自身座標
    void ChangePositionByDrag(PointerEventData eventData) {
        var rt = gameObject.GetComponent<RectTransform>();
 
        Vector3 globalMousePos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
        {
            rt.position = globalMousePos;
        }
    }
 
  
 
 
}

3.將事件究極封裝起來

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
using UnityEngine; 
using System.Collections; 
using UnityEngine.EventSystems; 
   
public class EventTriggerListener : EventTrigger { 
  
    #region 變量 
    //帶參數是爲了方便取得綁定了UI事件的對象   
    public delegate void PointerEventDelegate(GameObject go, PointerEventData eventData); 
    public delegate void BaseEventDelegate(GameObject go, BaseEventData eventData); 
    public delegate void AxisEventDelegate(GameObject go, AxisEventData eventData); 
   
    public event PointerEventDelegate onPointerEnter; 
    public event PointerEventDelegate onPointerExit; 
    public event PointerEventDelegate onPointerDown; 
    public event PointerEventDelegate onPointerUp; 
    public event PointerEventDelegate onPointerClick; 
    public event PointerEventDelegate onInitializePotentialDrag; 
    public event PointerEventDelegate onBeginDrag; 
    public event PointerEventDelegate onDrag; 
    public event PointerEventDelegate onEndDrag; 
    public event PointerEventDelegate onDrop; 
    public event PointerEventDelegate onScroll; 
    public event BaseEventDelegate onUpdateSelected; 
    public event BaseEventDelegate onSelect; 
    public event BaseEventDelegate onDeselect; 
    public event AxisEventDelegate onMove; 
    public event BaseEventDelegate onSubmit; 
    public event BaseEventDelegate onCancel; 
    #endregion 
   
    public static EventTriggerListener GetListener(GameObject go) 
    
        EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); 
        if (listener == null) listener = go.AddComponent<EventTriggerListener>(); 
        return listener; 
    
  
    #region 方法 
    public override void OnPointerEnter(PointerEventData eventData) 
    
        if (onPointerEnter != null) onPointerEnter(gameObject, eventData); 
    
    public override void OnPointerExit(PointerEventData eventData) 
    
        if (onPointerExit != null) onPointerExit(gameObject, eventData); 
    
    public override void OnPointerDown(PointerEventData eventData) 
    
        if (onPointerDown != null) onPointerDown(gameObject, eventData); 
    
    public override void OnPointerUp(PointerEventData eventData) 
    
        if (onPointerUp != null) onPointerUp(gameObject, eventData); 
    
    public override void OnPointerClick(PointerEventData eventData) 
    
        if (onPointerClick != null) onPointerClick(gameObject, eventData); 
    
    public override void OnInitializePotentialDrag(PointerEventData eventData) 
    
        if (onInitializePotentialDrag != null) onInitializePotentialDrag(gameObject, eventData); 
    
    public override void OnBeginDrag(PointerEventData eventData) 
    
        if (onBeginDrag != null) onBeginDrag(gameObject, eventData); 
    
    public override void OnDrag(PointerEventData eventData) 
    
        if (onDrag != null) onDrag(gameObject, eventData); 
    
    public override void OnEndDrag(PointerEventData eventData) 
    
        if (onEndDrag != null) onEndDrag(gameObject, eventData); 
    
    public override void OnDrop(PointerEventData eventData) 
    
        if (onDrop != null) onDrop(gameObject, eventData); 
    
    public override void OnScroll(PointerEventData eventData) 
    
        if (onScroll != null) onScroll(gameObject, eventData); 
    
    public override void OnUpdateSelected(BaseEventData eventData) 
    
        if (onUpdateSelected != null) onUpdateSelected(gameObject, eventData); 
    
    public override void OnSelect(BaseEventData eventData) 
    
        if (onSelect != null) onSelect(gameObject, eventData); 
    
    public override void OnDeselect(BaseEventData eventData) 
    
        if (onDeselect != null) onDeselect(gameObject, eventData); 
    
    public override void OnMove(AxisEventData eventData) 
    
        if (onMove != null) onMove(gameObject, eventData); 
    
    public override void OnSubmit(BaseEventData eventData) 
    
        if (onSubmit != null) onSubmit(gameObject, eventData); 
    
    public override void OnCancel(BaseEventData eventData) 
    
        if (onCancel != null) onCancel(gameObject, eventData); 
    
    #endregion 
   
}


調用:

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
using UnityEngine; 
using System.Collections; 
using UnityEngine.EventSystems; 
   
public class TestUI3 : MonoBehaviour { 
   
    private GameObject button; 
    private GameObject image; 
   
    void Start ()  
    
        button = GameObject.Find("Button"); 
        image = GameObject.Find("Image"); 
        EventTriggerListener.GetListener(button).onPointerClick += Click; 
        EventTriggerListener.GetListener(image).onDrag += Drag; 
    
   
    public void Click(GameObject go) 
    
        Debug.Log(go.name); 
    
   
    public void Drag(GameObject go) 
    
        Debug.Log(go.name); 
    
}

發佈了40 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章