Unity UGUI 原理篇(四): Event System Manager 事件与触发

Event System

在建立出UI时,Unity会自动帮我们建立Event System物件,此物件是基于滑鼠、触摸、键盘的输入方式,传送 Event 到 Object 上,物件下有3个组件,分别为Event System Manager、Standalone Input Module、Touch Input Module


1.Event System Manager


控管所有Event,负责将滑鼠、触摸、键盘输入方式(Input Module) 与 被选中的 Object 互相协调,每个 “Update” Event System 都会接收所有呼叫,并判断出这一瞬间要使用哪种Input Modules

Event System Info

当按下Play后,点选Event System物件,会在inspector显示 选中物件、位置、接收事件的Camera等等资讯



First Selected

执行时第一次要选择的Object,例如:选择为 InputField (输入框) 后 ,按下Play后就会将游标 Force 在 InputField 上


Send Navigation Events

是否开启UI导航功能,导航功能是可以用键盘的 “上”、”下”、”左”、”右”、”Cancel(Esc)”、”Sumit(Enter)” 控制选择的UI

举例:如果画面上有多个选单按钮,我们可以设定按钮上的 Navigation Options 这裡使用Explicit方式,来指定按下键盘 “上”、”下”、”左”、”右” 要选取哪一个物件

Select On Up :当键盘按下 “上” 键后要选择的物件,Down、Left、Right 不多做赘述


Visualize Buttin: 按下Visualize可以看到物件指向的黄线



Drag Threshold

Drag Event灵敏度,越低越灵敏


2.Standalone Input Module


电脑输入控制模组,主要影响著滑鼠与键盘的输入,使用 Scene 中的 Raycasters 计算哪个元素被点中,并传递 Event

Horizontal Axis

代表 Input Module 中的 Horizontal Axis,可以被设定为 Input Manager 中的值,Vertical Axis、Submit Button、Cancel Button 不多做赘述


Input Actions Per Second

每秒能输入的最大按钮与滑鼠次数



Repeat Delay

重复输入的延迟



事件执行完整流程

键盘输入

1.Move Event:透过 input manager 验证输入 axis、left、right、up、down 按钮,传递给 selected object

2.Submit 、Cancel Button:物件已经 Preesed (按下)时,透过 input manager 验证输入  submit 、cancel 按钮,传递给 selected object

滑鼠输入

1.如果是新的按下

a.传送 PointerEnter event

b.传送 PointerPress event

c.将 drag 相关暂存

e.传送 BeginDrag event

f.设定Event system中的 selected object 为按下的Object

2.如果是持续按下(Drag)

a.处理移动相关

b.传送 Drag event

c.处理 Drag 时跨到其他物体的 PointerEnter event、PointerExit event

3.如果是释放(滑鼠放开)

a.传送 PointerUp event

b.如果滑鼠放开与按下时的物件一样,传送 PointerClick event

c.如果有 drag 相关暂存,传送 Drop event

d.传送EndDrag event

4.滑鼠中键滚轮传送scroll event



3.Touch Input Module


触摸输入模组,主要用于移动设备上,可以透过Touch、Drag的方式响应,使用 Scene 中的 Raycasters 计算哪个元素被点中,并传递 Event

事件执行完整流程

与Standalone Input Module 的滑鼠输入一样,滑鼠点下想成触摸即可


4.Event System 触发流程

1.使用者输入(滑鼠、触摸、键盘)

2.透过 Event System Manager 决定使用 Standalone 还是 Touch Input Module

3.决定使用的 Input Module 后,透过 Scene 中的 Raycasters 计算哪个元素被点中

4.传送Event


Graphic Raycaster (图形 射线检测员)

组件位置:Unity Menu Item → Component → Event → Graphic Raycaster


建立 Canvas 物件时下的其中一个 Component,Raycaster 会观察 Canvas下所有图形,并检测是否被击中,射线检测其实就是指定位置与方向后,投射一条隐形线并判断是否有碰撞体在线上,射线检测这点官方已经有详细说明,这裡用于判断是否点选到UI图形

Ignore Reversed Graphics:

背对著画面的图形,射线检测是否要忽略此图形

举例:当图形Y轴进行旋转180后,此时是背对著画面,这时是如果有打勾,就会忽略不检测此图形



Blocked Objects 、 Blocking Mask:

主要用于当Canvas Component Render Mode 使用 World Space 或是 Camera Space 时,UI 前有 3D 或是 2D Object 时,将会阻碍射线传递到 UI 图形

Blocked Objects 阻碍射线的 Object 类型

Blocking Mask 勾选的 Layer 将会阻碍射线

举例:如果画面上有一个 Button 与 Cube 位置故意重叠,现在点击重叠之处会发现 Button 还是会被触发


如果将Cube 的 Layer 改为 Test01 ,Blocked Objects 设定为 Three D,Blocking Mask 只勾选 Test01,再次点选重叠区域,会发现 Cube 会阻碍射线检测,此时按钮会接收不到射线,当然也不会有反应



Physics Raycaster (物理物件 射线检测员)

组件位置:Unity Menu Item → Component → Event → Physics Raycaster

透过 Camera 检测 Scene 中的 3D GameObject(必须有 Collider Component),有实现 Event Interfaces 接口的物件将会接收到 Message 通知,例如能让 3D GameObject 能接收 点下Event 或是 拖拉Event 等等…..,看更多 Event 请点我

接下来让我们透过实例理解

1.建立 EventSystem,进行 Event 处理

物件位置:Unity Menu Item → GameObject → UI → EventSystem

2.Camera下增加 Physics Raycaster Component,用来观察射线

 

3.实现 Event Interfaces 接口,这裡有两种方式,一种是建立 Script 直接实作 Interfaces ,一种是使用Event Trigger Component

第一种 建立 Script 直接实作 Interfaces

a.建立一个 Script,实作 Event Interfaces


EventTest.csC#
using UnityEngine;
using UnityEngine.EventSystems;

public class EventTest : MonoBehaviour, IPointerDownHandler
{
    public void OnPointerDown(PointerEventData eventData)
    {
        print(gameObject.name);
    }
}


Line. 2:using  UnityEngine.EventSystems 汇入命名空间

Line. 4:继承 Event Interfaces,这裡是IPointerDownHandler(点下事件),看更多 Event 请点我

Line. 6~8:实作方法,传入 PointerEventData 为事件资料

b.建立一个3D物件(此称为Cube),并增加 BoxCollider Component


c.将 Script 放至 Cube 下,Inspector 中会出现 Intercepted Events 资讯,显示出正在监听的 Event


d.此时点击 Cube 就会通知 OnPointerDown 方法并传入事件资讯

第二种 使用Event Trigger Component 实作 Interfaces

a.建立一个 Script,实作方法,用于接收 Event Trigger 通知


EventTriggerTest.csC#
using UnityEngine;
using UnityEngine.EventSystems;

public class EventTriggerTest : MonoBehaviour
{
    //BaseEventData 動態傳入事件資訊
    public void OnPointerDown(BaseEventData eventData)
    {
        print("OnPointerDown--BaseEventData");
    }

    //純呼叫
    public void OnPointerDown()
    {
        print("OnPointerDown--non");
    }

    //傳入int
    public void OnPointerDown(int i)
    {
        print("OnPointerDown--int");
    }
}


Line. 2:using  UnityEngine.EventSystems 汇入命名空间

Line. 6~8:实作方法,这边实作3种

b.建立一个3D物件(此称为Cube),并增加 BoxCollider Component


c.将 Script 放至 Cube 下

d.Cube 下加入 Event Trigger Component,主要接收来至 Event System 的 Event ,并呼叫有实作的 Event

组件位置:Unity Menu Item → Component → Event → Event Trigger

e.点选 Add New Event Type 选择要实作的 Event 类型 ,这裡使用PointerDown(点下事件)举例


f.此时会新增一个UnityEvents,是一种透过编辑器设定的方式,设定 Event 触发时要通知的方法与属性,详细可以参考以下,这边简单说明

胡乱说‧随便写 – Unity:使用 UnityEngine.Events 让程式更灵活、稳定

Unity – Manual: UnityEvents

点下 “+” 按钮后,拖入要通知的Scene GameObject,Unity Event 就会寻找此 GameObject 上所有 Public 的方法与属性 ,就可以新增 Event 触发时 “通知的方法” 与 “预修改属性”

g.GameObject 拖入 Cube,通知方法设定 Script 中的3个方法


h.此时点击 Cube 就会触发 PointerDown ,通知 Script 中的3个方法


4.实作注意点:

■ Scene 必需有 EventSystem GameObject

■ Camera 必需有 Physics Raycaster Component

■ 3D GameObject 必须有 Collider Component

■ 实作 Event Interfaces 的方式,一种是建立 Script 直接实作 Interfaces ,一种是使用 Event Trigger Component,由上面实作可以知道,使用 Event Trigger 的方式可以使用编辑器设定,设定触发时的 “通知方法” 与 “修改属性”,且更为弹性


Physics 2D Raycaster
组件位置:Unity Menu Item → Component → Event → Physics 2D Raycaster

跟 Physics Raycaster 只差在于,Physics 2D Raycaster 是检测 Scene 中的 2D GameObject,当然 GameObject 上必须有 Collider2D Component,这边不再赘述

后记
我们透过输入的方式不同与 Raycaster 的关系,理解了整个 Event System 触发流程,而且也知道怎麽实作 Event 与应用 Event,不管是3D、2D、UI物件都可以方便的套用,大大提升开发速度、简化语法,可说是非常方便的功能


参考资料
■ Unity – Manual: Event System

http://docs.unity3d.com/Manual/EventSystem.html

■ Unity – Manual: UnityEvents

http://docs.unity3d.com/Manual/UnityEvents.html

■ Unity – Raycasting

http://unity3d.com/cn/learn/tutorials/modules/beginner/physics/raycasting

■ 胡乱说‧随便写 – Unity:使用 UnityEngine.Events 让程式更灵活、稳定

http://godstamps.blogspot.tw/2015/10/unity-unityengineevents.html

原文作者: k79k06k02k
原文链接: http://k79k06k02k.com/blog/440/unity/unity-ugui-%E5%8E%9F%E7%90%86%E7%AF%87%E5%9B%9B%EF%BC%9Aevent-system-manager-%E4%BA%8B%E4%BB%B6%E8%88%87%E8%A7%B8%E7%99%BC

猜你喜欢

转载自blog.csdn.net/qq_32821435/article/details/80157388
今日推荐