EventSystem

Event System

组成

系统生成的Event System里面主要有两个Components,分别是Event System和Standalone Input Module。

其中Standalone Input Module是派生自BaseInputModule。


 

作用

1. EventSystem

负责处理输入、射线投射以及发送事件

一个场景中只能有一个EventSystem,否则EventSystem会失效

2. BaseInputModule

负责处理输入(点击、拖拽等),把输入事件发送到具体的对象

3. BaseRaycaster

负责确定目标对象

在UI中:就是GraphicRaycaster
非UI中:就需要自己在摄像机上绑定并且检测对象上要有Collider

小结

EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象。

 


 

工作流

  1. BaseInputModule接收用户的输入
  2. BaseRaycaster根据用户的输入,找到目标物体
  3. 根据用户的输入事件,调用目标物体上的对应接口实现。

内部工作机制

  1. EventSystem把其GameObject上的所有BaseInputModule放到一个内部列表中。
  2. 在每一帧调用UpdateModules方法,该方法会去调用列表中所有BaseInputModule的UpdateModule方法。
  3. 在UpdateModule方法中,BaseInputModule会把自己的状态修改为"Updated",之后BaseInputModule的Process接口才会被调用

 


 

事件

事件都必须在对象内操作才会发生

拖拉事件
接口事件作用注意事项
IBeginDragHandlerOnBeginDrag开始拖拉必须同时实现IDragHandler,否则失效
IDragHandlerOnDrag正在拖拉每当移动一定距离,就发生一次拖拉事件
IEndDragHandlerOnEndDrag结束拖拉必须同时实现IDragHandler,否则失效
IInitializePotentialDragHandlerOnInitializePotentialDrag可能发生拖拉必须同时实现IDragHandler。在对象内点击就会发生
点击事件
接口事件作用注意事项
IPointerEnterHandlerOnPointerEnter鼠标进入对象 
IPointerExitHandlerOnPointerExit鼠标离开对象 
IPointerDownHandlerOnPointerDown按下鼠标 
IPointerClickHandlerOnPointerClick点击中该对象在OnPointerUp后发生
IPointerUpHandlerOnPointerUp松开鼠标 
其他事件
接口事件作用注意事项
IScrollHandlerOnScroll操作鼠标中间的滚轮 
ISelectHandlerOnSelect当EventSystem选中该对象使用EventSystem中的SetSelectedGameObject方法来选中
IDeselectHandlerOnDeselect不再选中该对象点击对象外的地方就会变成不选中
IUpdateSelectedHandlerOnUpdateSelected当对象被选中,则每帧都会发生对象被选中才会发生
ISubmitHandlerOnSubmit点击Submit键(默认是Enter键)对象被选中才会发生
ICancelHandlerOnCancel点击Cancel键(默认是Esc键)对象被选中才会发生
IMoveHandlerOnMove点击方向键对象被选中才会发生
IDropHandlerOnDrop拖拉结束拖拉开始的地方必须先实现IDragHandler,该事件在拖拉结束的对象上发生(但不能是拖拉开始的对象)

OnDrop的一个例子:物体A上实现了IDragHandler(和IDropHandler),物体B上实现了IDropHandler。从物体A上开始Drag,在物体A上结束Drag,没有触发OnDrop;从物体A上开始Drag,在物体B上结束Drag,可以触发OnDrop。

 


 

实战 - UGUI监听事件

使用方式
  1. 实现一个UIEventListener类,继承自MonoBehaviour
  2. 在需要监听事件的UI物体上绑定UIEventListener
  3. 使用该类上的AddEventListener来给事件绑定回调函数
代码实现
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); } }

转载于:https://www.cnblogs.com/Cocomo/p/5631937.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值