赞
踩
Resource:click here
----------------------------
系统生成的Event System里面主要有两个Components,分别是Event System和Standalone Input Module。
其中Standalone Input Module是派生自BaseInputModule。
1. EventSystem
负责处理输入、射线投射以及发送事件
一个场景中只能有一个EventSystem,否则EventSystem会失效
2. BaseInputModule
负责处理输入(点击、拖拽等),把输入事件发送到具体的对象
可以自己继承BaseInputModule来实现自己的交互方式。
3. BaseRaycaster
负责确定目标对象
在UI中:GraphicRaycaster
非UI中:Physics Raycaster 和 Physics 2D Raycaster
此类系统均依赖于Event Camera,并用作全部光线投射的源。
可以自己继承BaseRaycaster来创建自己的光线投射系统。
小结
EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象。
事件都必须在对象内操作才会发生
拖拉事件
接口 | 事件 | 作用 | 注意事项 |
---|---|---|---|
IBeginDragHandler | OnBeginDrag | 开始拖拉 | 必须同时实现IDragHandler,否则失效 |
IDragHandler | OnDrag | 正在拖拉 | 每当移动一定距离,就发生一次拖拉事件 |
IEndDragHandler | OnEndDrag | 结束拖拉 | 必须同时实现IDragHandler,否则失效 |
IInitializePotentialDragHandler | OnInitializePotentialDrag | 可能发生拖拉 | 必须同时实现IDragHandler。在对象内点击就会发生 |
点击事件
接口 | 事件 | 作用 | 注意事项 |
---|---|---|---|
IPointerEnterHandler | OnPointerEnter | 鼠标进入对象 | |
IPointerExitHandler | OnPointerExit | 鼠标离开对象 | |
IPointerDownHandler | OnPointerDown | 按下鼠标 | |
IPointerClickHandler | OnPointerClick | 点击中该对象 | 在OnPointerUp后发生 |
IPointerUpHandler | OnPointerUp | 松开鼠标 |
其他事件
接口 | 事件 | 作用 | 注意事项 |
---|---|---|---|
IScrollHandler | OnScroll | 操作鼠标中间的滚轮 | |
ISelectHandler | OnSelect | 当EventSystem选中该对象 | 使用EventSystem中的SetSelectedGameObject方法来选中 |
IDeselectHandler | OnDeselect | 不再选中该对象 | 点击对象外的地方就会变成不选中 |
IUpdateSelectedHandler | OnUpdateSelected | 当对象被选中,则每帧都会发生 | 对象被选中才会发生 |
ISubmitHandler | OnSubmit | 点击Submit键(默认是Enter键) | 对象被选中才会发生 |
ICancelHandler | OnCancel | 点击Cancel键(默认是Esc键) | 对象被选中才会发生 |
IMoveHandler | OnMove | 点击方向键 | 对象被选中才会发生 |
IDropHandler | OnDrop | 拖拉结束 | 拖拉开始的地方必须先实现IDragHandler,该事件在拖拉结束的对象上发生(但不能是拖拉开始的对象) |
OnDrop的一个例子:物体A上实现了IDragHandler(和IDropHandler),物体B上实现了IDropHandler。从物体A上开始Drag,在物体A上结束Drag,没有触发OnDrop;从物体A上开始Drag,在物体B上结束Drag,可以触发OnDrop。
使用方式
代码实现
-
- public class TestUIListener : MonoBehaviour, IPointerClickHandler {
- public delegate void GoDelegate(GameObject go);
- public GoDelegate onClick;
-
- void Start () {
-
- }
-
- void Update () {
-
- }
-
- public void AddListener(UIEventType eventType, object callBack)
- {
- //把回调函数转换为合适的委托函数
- GoDelegate goCallBack = null;
- if (callBack is LuaFunction)
- {
- goCallBack = delegate(GameObject obj)
- {
- (callBack as LuaFunction).Call(obj);
- };
- }
-
-
- else
- {
- goCallBack = callBack as GoDelegate;
- }
-
- //把回调添加到点击事件上
- if (eventType == UIEventType.CLICK)
- {
- onClick += goCallBack;
- }
- }
-
- public void OnPointerClick(PointerEventData eventData)
- {
- if(onClick != null)
- onClick(gameObject);
- }
- }
上述代码为了简单只实现了点击的事件监听。
Lua使用例子
-
- local listener = TestBtn:GetComponent("TestUIListener");
- listener:AddListener(UIEventType.CLICK, OnClick);
-
- function OnClick(go)
- ...
- end
虽然存在Event Trigger组件,但是因为该组件与全部事件绑定,并接收全部事件,因此出于性能考虑,应该编写自己的事件监听脚本。
作者:Kaima_Chen
链接:https://www.jianshu.com/p/ae332979a022
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。