当前位置:   article > 正文

Unity3D - EventSystem完全掌握_unity 动态设置eventsystem的pointdrag

unity 动态设置eventsystem的pointdrag

Resource:click here

----------------------------

 

Event System

组成

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

 


其中Standalone Input Module是派生自BaseInputModule。

 


作用

1. EventSystem

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

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

2. BaseInputModule

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

  1. Standalone Input Module:基本的键盘和鼠标输入系统,并跟踪鼠标的位置,以及鼠标/键盘所按下的按键。
  2. Touch Input Module:基本的触摸输入系统,用于处理触摸、拖拽以及位置数据,并可在其实现中模拟鼠标行为。
  3. Pointer Input Module:提供上面两者的基本功能,同时还可以通过代码进行访问。

可以自己继承BaseInputModule来实现自己的交互方式。

3. BaseRaycaster

负责确定目标对象

在UI中:GraphicRaycaster
非UI中:Physics Raycaster 和 Physics 2D Raycaster

此类系统均依赖于Event Camera,并用作全部光线投射的源。
可以自己继承BaseRaycaster来创建自己的光线投射系统。

小结

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来给事件绑定回调函数

代码实现

  1. public class TestUIListener : MonoBehaviour, IPointerClickHandler {
  2. public delegate void GoDelegate(GameObject go);
  3. public GoDelegate onClick;
  4. void Start () {
  5. }
  6. void Update () {
  7. }
  8. public void AddListener(UIEventType eventType, object callBack)
  9. {
  10. //把回调函数转换为合适的委托函数
  11. GoDelegate goCallBack = null;
  12. if (callBack is LuaFunction)
  13. {
  14. goCallBack = delegate(GameObject obj)
  15. {
  16. (callBack as LuaFunction).Call(obj);
  17. };
  18. }
  19. else
  20. {
  21. goCallBack = callBack as GoDelegate;
  22. }
  23. //把回调添加到点击事件上
  24. if (eventType == UIEventType.CLICK)
  25. {
  26. onClick += goCallBack;
  27. }
  28. }
  29. public void OnPointerClick(PointerEventData eventData)
  30. {
  31. if(onClick != null)
  32. onClick(gameObject);
  33. }
  34. }

上述代码为了简单只实现了点击的事件监听。

Lua使用例子

  1. local listener = TestBtn:GetComponent("TestUIListener");
  2. listener:AddListener(UIEventType.CLICK, OnClick);
  3. function OnClick(go)
  4. ...
  5. end

注意事项

虽然存在Event Trigger组件,但是因为该组件与全部事件绑定,并接收全部事件,因此出于性能考虑,应该编写自己的事件监听脚本。



作者:Kaima_Chen
链接:https://www.jianshu.com/p/ae332979a022
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/127260
推荐阅读
相关标签
  

闽ICP备14008679号