UGUI事件顺序

今天做一个功能,类似与吃鸡游戏的小地图和大地图,功能大概包括周围人物怪物标识,场景物资标识,玩家和队友再地图上的标点和 自身与标点的划线、缩放、拖拽等

因为设计点击和拖拽,所以需要单独监听这两个事件,但是我发现UGUI 的事件执行顺序是这样的

点击一下的事件执行顺序

1
2
3
4
5
6
OnPointerDown
OnInitializePotentialDrag
OnPointerEnter
OnPointerUp
OnPointerClick
OnPointerExit

当我按下并拖动的事件执行顺序

1
2
3
4
5
6
7
8
9
OnPointerDown
OnInitializePotentialDrag
OnPointerEnter
OnBeginDrag
OnDrag
OnPointerUp
OnPointerClick
OnEndDrag
OnPointerExit

可以看出 当同一个物体我们同时监听它的点击事件和拖动事件的时候,是不能直接通过OnPointerClick或者OnPointerDown来得到的,因为当我们拖动的时候也会执行这两个事件,所以用以下解决方案。

  • 设置一个bool变量
  • OnPointerDown事件把变量设为true
  • OnDrag设为false,或者OnBeginDrag
  • 在OnPointerUp事件触发的时候判断这边变量是否为true,如果是true 则认为是点击,否则是拖动

很简单,代码就不写了。
写一下测试代码吧。后续有机会再写一下关于Entitas的笔记。

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
using UnityEngine;
using UnityEngine.EventSystems;

public class EventTest : MonoBehaviour,
IPointerClickHandler,
IPointerEnterHandler,
IPointerExitHandler,
IPointerDownHandler,
IPointerUpHandler,
IBeginDragHandler,
IDragHandler,
IInitializePotentialDragHandler,
IEndDragHandler,
IDropHandler,
IUpdateSelectedHandler,
ISelectHandler,
IDeselectHandler,
IScrollHandler,
IMoveHandler,
ISubmitHandler,
ICancelHandler
{
#region 鼠标指针类
//鼠标进入时响应
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("OnPointerEnter");
}

//鼠标离开时响应
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("OnPointerExit");
}

//鼠标按下时响应
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("OnPointerDown");
}

//鼠标释放时响应
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("OnPointerUp");
}

//鼠标点击时响应
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("OnPointerClick");
}
#endregion


#region 拖拽类
//初始化拖拽
public void OnInitializePotentialDrag(PointerEventData eventData)
{
Debug.Log("OnInitializePotentialDrag");
}

//开始拖拽
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("OnBeginDrag");
}

//拖拽中
public void OnDrag(PointerEventData eventData)
{
Debug.Log("OnDrag");
}

//拖拽结束
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("OnEndDrag");
}

//拖拽释放
public void OnDrop(PointerEventData eventData)
{
Debug.Log("OnDrop");
}
#endregion


#region 点选类
//当物体被选中时每帧触发
public void OnUpdateSelected(BaseEventData eventData)
{
Debug.Log("OnUpdateSelected");
}

//选中物体
public void OnSelect(BaseEventData eventData)
{
Debug.Log("OnSelect");
}

//未选中物体
public void OnDeselect(BaseEventData eventData)
{
Debug.Log("OnDeselect");
}
#endregion

#region 输入类
//鼠标中轮滚动
public void OnScroll(PointerEventData eventData)
{
Debug.Log("OnScroll");
}

//移动物体
public void OnMove(AxisEventData eventData)
{
Debug.Log("OnMove");
}

//提交
public void OnSubmit(BaseEventData eventData)
{
Debug.Log("OnSubmit");
}

//取消
public void OnCancel(BaseEventData eventData)
{
Debug.Log("OnCancel");
}
#endregion
}
坚持原创技术分享,您的支持将鼓励我继续创作!