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原理篇Canvas 渲染模式

Unity3D-UGUI原理篇RectTransform 组件详解

Unity3D-UGUI原理篇Auto Layout 自动布局

Unity3D-UGUI原理篇使用 UnityEngine.Events 让程序更灵活稳定

Unity3D-UGUI应用篇使用UGUI实现层级菜单

Unity3D-UGUI应用篇使用Image实现进度条动画