Unity 事件系统

一、 消息系统

新的 UI 系统使用一种消息系统来取代 SendMessage。该系统是纯 C# 系统,旨在解决 SendMessage 存在的一些问题。该系统使用可在 MonoBehaviour 上实现的自定义接口来指示组件能够从消息系统接收回调。调用时会指定目标游戏对象;该调用将在游戏对象的所有(实现了指定接口以据此发出该调用的)组件上发出。借助消息系统可传递自定义用户数据,并可指定事件应在游戏对象层级视图中传播的距离:应该仅为指定的游戏对象执行,还是应该在子对象和父对象上也执行。除此之外,消息框架还提供 helper 函数来搜索和查找实现了给定消息接口的游戏对象。

消息系统是通用型系统,不仅可用于 UI 系统,还可用于一般游戏代码。添加自定义消息事件相对简单,借助 UI 系统用于所有事件处理的相同框架即可实现。

如何定义自定义消息?

如果希望定义自定义消息,此过程相对简单。在 UnityEngine.EventSystems 命名空间中,有一个名为“IEventSystemHandler”的基本接口。从此接口扩展的任何内容都可以视为通过消息系统接收事件的目标。

要发送消息,可使用一个静态 helper 类来执行此操作。在参数方面,需要消息的目标对象、一些特定于用户的数据以及一个映射到所需目标消息接口中特定函数的仿函数 (functor)。

ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());

此代码将在游戏对象目标上实现了 ICustomMessageTarget 接口的所有组件上执行 Message1 函数。ExecuteEvents 类的脚本文档中介绍了执行函数的其他形式,例如在子对象或父对象中执行。

二、 支持的事件

事件系统支持许多事件,并可在用户编写的自定义输入模块中进一步自定义它们。

独立输入模块和触摸输入模块支持的事件由接口提供,通过实现该接口即可在 MonoBehaviour 上实现这些事件。如果配置了有效的事件系统,则会在正确的时间调用事件。

  • IPointerEnterHandler - OnPointerEnter - 当指针进入对象时调用
  • IPointerExitHandler - OnPointerExit - 当指针退出对象时调用
  • IPointerDownHandler - OnPointerDown - 在对象上按下指针时调用
  • IPointerUpHandler - OnPointerUp - 松开指针时调用(在指针正在点击的游戏对象上调用)
  • IPointerClickHandler - OnPointerClick - 在同一对象上按下再松开指针时调用
  • IInitializePotentialDragHandler - OnInitializePotentialDrag - 在找到拖动目标时调 用,可用于初始化值
  • IBeginDragHandler - OnBeginDrag - 即将开始拖动时在拖动对象上调用
  • IDragHandler - OnDrag - 发生拖动时在拖动对象上调用
  • IEndDragHandler - OnEndDrag - 拖动完成时在拖动对象上调用
  • IDropHandler - OnDrop - 在拖动目标对象上调用
  • IScrollHandler - OnScroll - 当鼠标滚轮滚动时调用
  • IUpdateSelectedHandler - OnUpdateSelected - 每次勾选时在选定对象上调用
  • ISelectHandler - OnSelect - 当对象成为选定对象时调用
  • IDeselectHandler - OnDeselect - 取消选择选定对象时调用
  • IMoveHandler - OnMove - 发生移动事件(上、下、左、右等)时调用
  • ISubmitHandler - OnSubmit - 按下 Submit 按钮时调用
  • ICancelHandler - OnCancel - 按下 Cancel 按钮时调用

三、射线投射器

事件系统需要一种方法来检测当前输入事件需要发送到的位置,而此方法由射线投射器 (Raycaster) 提供。给定屏幕空间位置的情况下,射线投射器将收集所有潜在目标,确定它们是否在给定位置下,然后返回最接近屏幕的对象。提供了几种类型的射线投射器:

  • 图形射线投射器 (Graphic Raycaster) - 用于 UI 元素,位于画布上,并在画布中搜索
  • 2D 物理射线投射器 (Physics 2D Raycaster) - 用于 2D 物理元素
  • 物理射线投射器 (Physics Raycaster) - 用于 3D 物理元素

当场景中存在并启用了射线投射器时,只要从输入模块发出查询,事件系统就会使用该射线投射器。

如果使用多个射线投射器,那么这些射线投射器都会进行针对性投射,并且结果将根据与元素的距离进行排序。

上一篇:Unity 常用特性


下一篇:Unity Button中Transition的四种类型