Unity3D-UGUI原理篇Event System Manager 事件与触发
Posted 恬静的小魔龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D-UGUI原理篇Event System Manager 事件与触发相关的知识,希望对你有一定的参考价值。
推荐阅读
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
这个系列文章,是为了记录分析UGUI的各种原理:
- UGUI的渲染模式。
- UGUI的缩放计算。
- UGUI的锚点定位。
- UGUI的层级渲染流程。
- UGUI的事件触发原理。
- UGUI的布局自动布局方式。
这是本系列文章的第四篇:
【Unity3D-UGUI原理篇】(一)Canvas 渲染模式
【Unity3D-UGUI原理篇】(二)Canvas Scaler 缩放原理
【Unity3D-UGUI原理篇】(三)RectTransform 组件详解
【Unity3D-UGUI原理篇】(四)Event System Manager 事件与触发
【Unity3D-UGUI原理篇】(五)Auto Layout 自动布局
【Unity3D-UGUI原理篇】(六)使用 UnityEngine.Events 让程序更灵活、稳定
二、Event System
创建UGUI元素的时候,会自动生成Event System对象,这个对象是基于鼠标、触摸、键盘的输入方式,将事件传递给对象上。
这个Event System默认挂载两个组件:Event System、Standalone Input Module,如下图所示:
2-1、Event System组件
属性 | 介绍 |
---|---|
First Selected | 执行时第一次要选择的Object,例如:选择为 InputField (输入框) 后 ,按下Play后就会将游标 Force 在 InputField 上 |
Send Navigation Events | 是否开启UI导航功能,导航功能是可以用键盘的 “上”、”下”、”左”、”右”、”Cancel(Esc)”、”Sumit(Enter)” 控制选择的UI |
Drag Threshold | 灵敏度,越低越灵敏 |
2-2、Standalone Input Module组件
Standalone Input Module处理输入的鼠标或触摸事件,进行事件的分发。
属性 | 介绍 |
---|---|
Horizontal Axis | 代表 Input Module 中的 Horizontal Axis,可以被设定为 Input Manager 中的值 |
Vertical Axis | 代表 Input Module 中的 Vertical Axis,可以被设定为 Input Manager 中的值 |
Submit Button | 代表 Input Module 中的 Submit Button,可以被设定为 Input Manager 中的值 |
Cancel Button | 代表 Input Module 中的 Cancel Button,可以被设定为 Input Manager 中的值 |
Input Actions Per Second | 每秒能输入的最大按钮与滑动鼠标次数 |
Repeat Delay | 重复输入的延迟 |
Force Module Active | 激活力模块 |
2-3、EventSystem的信息显示
运行程序后,点击Event System对象,在Inspector视图中点击EventSystem,会显示选中对象的属性、位置、接收时间的相机等信息,如下图所示:
2-4、运行流程分析
使用UGUI制作界面时,EventSystem的作用就像是为UGUI设计好的消息中心,它管理着所有能参与消息处理的UGUI组件,比如Panel、Image、Button等。
EventSytem组件,是消息机制的核心。
StandaloneInputModule,是负责产生输入的组件。
StandaloneInputModule继承自BaseInputModule实现类,类似的实现类Unity中还有另外几个,用户也可以自定义一个实现类用于事件处理。
但是,还少一个部分,那就是怎么确定某个事件是发给谁的,EventSystem响应的是用户的点击、触摸、拖动、长按之类的操作,那么EventSystem是怎么确定这些操作是针对谁的呢,所以还需要一个射线检测模块,来判断鼠标对准的UI是哪一个,这也就是GraphicPaycaster组件。
GraphicPaycaster专门负责Canvas下的UI的射线检测和计算问题。
至此,EventSystem在UGUI中的情况就比较清晰了,一个EventSystem对象负责管理所有事件相关对象,该对象下挂载了EventSystem组件和StandaloneInputModule组件,前者为管理脚本,后者为输入模块。Canvas对象下挂载了GraphicRaycaster负责处理射线相关运算,用户的操作都会通过射线检测来映射到UGUI组件上,InputModule将用户的操作转化为射线检测,Raycaster则找到目标对象并通知EventSystem,最后EventSystem发送事件让目标对象进行响应。
整理的流程如下图所示:
三、Graphic Raycaster (图形射线检测)
建立 Canvas 时会自动挂载一个Raycaster组件,如下图所示:
Raycaster会检测Canvas下所有UI,并检测是否被击中。
射线检测其实就是指定位置与方向后,投射一条隐形线并判断是否有碰撞体在线上。
属性 | 介绍 |
---|---|
Ignore Reversed Graphics | 背对着画面的图形,射线检测是否要忽略此图形 |
Blocking Objects | 阻碍射线的 Object 类型 |
Blocking Mask | 勾选的 Layer 将会阻碍射线 |
下面用列子来展示Blocked Objects 、 Blocking Mask属性。
比如画面上有一个 Button 与 Cube 位置故意重叠,现在点击重叠之处会发现 Button 还是会被触发:
如果将Cube 的 Layer 改为 Test01 ,Blocked Objects 设定为 Three D,Blocking Mask 只勾选 Test01,再次点选重叠区域,会发现 Cube 会阻碍射线检测,此时按钮会接收不到射线,当然也不会有反应:
四、Physics Raycaster (物理射线检测)
给场景中的摄像机添加一个Physics Raycaster组件,组价属性如下:
Physics Raycaster透过 Camera 检测 Scene 中的 3D GameObject(必须有 Collider Component)。有实现 Event Interfaces 接口的物件将会接收到 Message 通知。
接下来,让我们通过一个实例演演示Physics Raycaster。
首先,我们需要使用脚本用来检测UI检测的接口,这里有两种方案,一种是使用IPointerDownHandler接口,一种是使用BaseEventData动态传入事件信息。
4-1、使用IPointerDownHandler接口传递监测
新建脚本EventTest.cs:
using UnityEngine;
using UnityEngine.EventSystems;
public class EventTest : MonoBehaviour, IPointerDownHandler
{
public void OnPointerDown(PointerEventData eventData)
{
print(gameObject.name);
}
}
新建一个对象Cube,将EventTest脚本附到Cube上:
此时点击 Cube 就会通知 OnPointerDown 方法并传入事件消息。
4-2、使用BaseEventData动态传入事件信息
新建脚本EventTriggerTest.cs:
using UnityEngine;
using UnityEngine.EventSystems;
public class EventTriggerTest : MonoBehaviour
{
//BaseEventData 动态传入事件信息
public void OnPointerDown(BaseEventData eventData)
{
print("OnPointerDown--BaseEventData");
}
//传递信息
public void OnPointerDown()
{
print("OnPointerDown--non");
}
//传入参数
public void OnPointerDown(int i)
{
print("OnPointerDown--int");
}
}
新建一个对象Cube,将EventTriggerTest脚本附到Cube上:
此时点击 Cube 就会通知 OnPointerDown 方法并传入事件消息。
以上是关于Unity3D-UGUI原理篇Event System Manager 事件与触发的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D-UGUI原理篇RectTransform 组件详解
Unity3D-UGUI原理篇Auto Layout 自动布局