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接口才会被调用

事件

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

拖拉事件

接口 事件 作用 注意事项
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。


实战 - 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

Unity -- EventSystem完全掌握的更多相关文章

  1. Unity 实现物体拖拽

    Unity实现拖拽: 也可以继承Unity EventSystem中的接口实现. 当鼠标按下的时候以左键为例: Using System.Collections; Using System.Colle ...

  2. Unity UGUI之Canvas&EventSystem

    最近想写一套关于UGUI所有控件的基础使用教程系列,主要是根据本人的使用心得来写的,所以其中可能难以避免会有不正确的地方. 好了进入主题,既然是第一篇,我觉得我有必要先介绍一下UGUI必不可缺的两个组 ...

  3. unity API 之EventSystem.current.IsPointerOverGameObject()

    命名空间 :UnityEngine.EventSystems 官方描述: public bool IsPointerOverGameObject(); public bool IsPointerOve ...

  4. Unity引擎GUI之Canvas和EventSystem

    最近想写一套关于UGUI所有控件的基础使用教程系列,主要是根据本人的使用心得以及部分测试附带字面翻译来写的,所以其中可能难以避免会有不正确的地方. 好了进入主题,既然是第一篇,我觉得我有必要先介绍一下 ...

  5. unity 3D物体使用EventSystem响应事件

    在ugui中创建一个canvas 之后会自动创建一个EventSystem,用来处理UI上的时间响应.(可以通过UI>EventSystem创建EventSystem) EventSystem ...

  6. Unity事件系统EventSystem简析

    相关组件和类 EventSystem 1.负责InputModule的切换(因为现在游戏大部分都只有一个StanaloneInputModule,所以切换这部分可以先不考虑). 2.负责InputMo ...

  7. Unity UI on the HoloLens

    Following the steps under "Required configuration" will allow Unity UI to continue to work ...

  8. 自制Unity小游戏TankHero-2D(1)制作主角坦克

    自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  9. Gvr SDK for Unity 分析(一)

    Gvr SDK概述 通过谷歌VR SDK for unity 为Android和iOS 构建虚拟现实应用程序 unity SDK在Android上支持构建应用程序for daydream 和 card ...

随机推荐

  1. PHP中的变量与常量详解

    几乎所有的编程语言都会涉及到变量和常量这两个概念,PHP也不例外.本节将介绍PHP语言中的变量和常量的应用方法. 一.什么是变量和常量 在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不 ...

  2. 【Alpha版本】冲刺阶段——Day 10

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  3. Asp.Net Core--简单的授权

    翻译如下: 在MVC中授权通过控制AuthorizeAttribute属性及其各种参数.在最简单的应用AuthorizeAttribute属性控制器或行动限制访问控制器或操作任何身份验证的用户. 例如 ...

  4. render()方法是render_to_response

    自django1.3开始:render()方法是render_to_response的一个崭新的快捷方式, 前者会自动使用 RequestContext.而后者必须coding 出来,这是最明显的区别 ...

  5. 我常用的crontab命令

    命令简介 crontab-操作每个用户的守护程序和该执行的时间表.部分参数说明crontab file [-u user]-用指定的文件替代目前的crontab.crontab-[-u user]-用 ...

  6. PHP 函数(数组字符串)

    函数四要素:  参数  变量   返回值  函数体 函数分类: 1.有参数的函数: function Show() { echo "hello"; } Show(); 2. 有返回 ...

  7. ajax提交form表单资料详细汇总

    一.ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单.通过在后台与服务器进行少量数据交换,ajax 可以使网页实现异步更新.这意味 ...

  8. Android笔记:通知

    可以在活动里创建,也可以在广播接收器里创建,还可以在服务里创建. NotificationManager manager = (NotificationManager)getSystemService ...

  9. (转)EClipse插件推荐

    http://www.importnew.com/4707.html 来自非营利性Eclipse基金会的Eclipse IDE以其插件生态系统著称.Eclipse市场拥有海量插件可供下载,你可以通过插 ...

  10. sql面试题一 学生成绩

    sql面试题一 学生成绩   原帖链接:http://topic.csdn.net/u/20081020/15/1ABF54D0-F401-42AB-A75E-DF90027CEBA0.html 表架 ...