Event Syetem及其功能
事件和委托机制
操作示例
开源及其应用方式
1、EventSystem可视为一类强大的管理系统,并提供了下列功能项:
# 对输入系统进行分类
# 监听当前输入状态
# 维护当前所选的GameObject
# 更新各个输入系统
# 针对输入和屏幕系统之间的光线投射测试进行编组
需要注意的是,场景中仅存在单一的EventSystem管理器,且与添加数量无关。
EventSystem的核心内容表示为静态实例,同时仅存在单一实例。
2、事件循环系统
按事件系统 → 输入扫描 → 向UI进行光线投射 → 缩放并绘制UI → 事件系统 实现循环操作
#Event System:循环开始,验证场景中处于活动状态的、输入系统的细节内容,并在开启下一阶段时对此类输入进行测试
#解析过程:一旦管理器识别输入类型(鼠标、键盘、触摸操作等),依次通知各输入系统并收集其当前状态
#处理过程:当输入系统获取各自状态时,将回调Event System,并通过现有的光线投射系统向场景中投射光线(物理光线投射器、图形投射器等),确定GameObject是否与用户输入间彼此交互。随后,在通知相关GameObject时,引发某些事件。
#后续处理:当Event System处理完毕后,执行渲染操作。
#返回至Event System:结束当前操作后,重复上述行为。
3、状态控制
在其他方面,EventSystem还可以确定当前所执行的体验状态,包括:
#所测试的输入系统
#当前选择内容,包括最初和最后所选取的对象
4、光线投射编组
针对光线投射测试,EventSystem还可表示为转向管理器,且全部路径均返回至EventSystem
当输入模块需要验证事务是否被某一特定输入交互行为所通知时,针对输入行为,将询问EventSystem当前坐标附近是否村咋子对应内容。随后,EventSystem将使用该位置,并遍历Canvas所注册的全部光线投射模块,进而查看是否产生碰撞。
当前所支持的光线投射模块包括如下几种:
# 物理光线投射器:测试场景中的3D对象
# 物理2D光线投射器:测试场景中的2D对象
# 图形光线投射器:测试场景中的UI对象
# 其他光线投射器:用户可构建自己的光线投射测试组件
5、与事件协同工作
新UI系统中引入了最新的 UnityEvent 逻辑,并实现了标准化和委托机制,进而管理场景中GameObject间的交互行为,即主要几种于基于新UI的输入交互行为。
简单的事件委托:
public UnityEvent myUnityEvent=new UnityEvent();
myUnityEvent.AddListener(MyAwesomeDelegate);
myUnityEvent.Invoke();
#使用参数
可采用希望传递的信息数据类型继承UnityEvent类
如果未向类中添加 [Serializable] 标签,UnityEvent将不会出现于编辑器的查看器中
#内建事件接口
Pointer事件:
IPointerEnterHandler:当鼠标指针进入到UI对象的Rect Transform区域时出现
IPointerExitHandler:当鼠标指针离开UI对象的Rect Transform区域时出现
IPointerDownHandler:当按下可选取的UI控件(如按钮)时出现
IPointerDownHandler:当释放可选取的UI控件(如按钮)时出现
IPointerClickHandler:当单击可选取的UI控件(按下和释放操作)时出现
Drag Handlers事件:
IInitializePotentialDragHandler:拖拽的首个点
IBeginDragHandler:表示确认后的、已开始的拖拽行为
IDragHandler:表示被拖拽的UI组件
IEndDragHandler:表示已释放的UI拖拽组件
IDropHandler:等同于拖拽结束操作但不包含拖拽数据
Miscellaneous事件:
IScrollHandler:当检测到输入设备上的滚动操作时被引发,例如鼠标滚轮
IUpdateSelectedHandler:当所选UI控件被更新或调整时引发
ISelectHandler:当UI控件被选取或处于焦点状态时引发
IDeselectHandler:当UI控件被反选或失去焦点状态时引发
IMoveHandler:当移动摇杆时引发(使用Input.GetAxis)
ISubmitHandler:当按下Submit按钮时引发(默认时为Enter键)
ICancelHandler:当按下Submit按钮时引发(默认时为Esc键)
#执行事件
using UnityEngine.EventSystems;
public class Tooltip : MonoBehaviour, IPointerEnterHandler
对接口添加相应的处理方法
public void OnPointerEnter(PointerEventData eventData)
{
}
6、构建自定义句柄或事件
当构建自定义事件时,首先需要定义如下内容:
#自定义事件的数据结构(拓展自BaseEventDate)
#自定义事件接口(扩展自IEventSystemHandler)
#包含了Execute函数的静态容器类
#Input模块(可选项且扩展自BaseInputModule),并以此处理和执行事件
#实现了接口的类或GameObject