您的位置:首页 > 移动开发 > Unity3D

Unity事件系统(翻译自Unity User Manual 5.6)

2018-02-28 15:27 267 查看

事件系统

事件系统是一种在应用程序内根据输入向物体发送事件的方法。这里的输入可以是键盘、鼠标、触摸或者其它定制(costom)输入。事件系统由很少的组件构成,它们共同协作来发送事件。

总览

当你向游戏物体增加一个事件系统组件时,你会注意到它并没有显露出许多功能。这是因为事件系统是被设计为事件系统模块之间沟通的管理者和协调者。

事件系统基本的功能如下:

- 管理当前选定的是哪一个游戏物体

- 管理当前使用的是哪一个输入模块

- 管理光线衍射(如果需要的话)

- 按需求更新所有的输入模块

输入模块

你可以在输入模块中规定事件系统行为的主要逻辑,包括:

- 处理输入

- 管理事件状态

- 向场景物体发送事件

在事件系统中,同一时间只能有一个输入模块是活跃的,并且输入模块必须是绑定在同一个游戏物体上的组件,这个游戏物体就是事件系统组件。(注意这里两个组件是指不同的事物。)

如果你想写一个定制输入模块,建议你发送由Unity中已经出现的UI组件所支持的事件。当然你也可以扩展编写你自己的事件,具体细节在消息系统文档中列出。

光线衍射器(待续。。。)

消息系统

新的UI系统使用了一个消息系统来替代发送消息(SendMessage)。这个系统是纯C#的,使用新的系统旨在解决一些SendMessage导致的问题。

新的消息系统使用定制接口来工作,这个定制接口在MonoBehaviour中执行,指示组件可以接收从消息系统传回的回调(callback)。当调用发生时,一个目标游戏物体(GameObject)被具体指定,它的所有执行了与该调用对应的接口的组件(component)都将收到调用。

消息系统允许了传递定制的用户数据,也规定了在游戏物体的继承体系中的传递范围————即调用只在特定的游戏物体上执行,还是同样需要在它的子类或父类上执行。

另外,消息框架还提供助手函数来寻找实施了指定消息接口的游戏物体。

消息系统是通用的,它不只是为使用了UI系统设计,同样也应用于全体的游戏代码。增加定制消息事件相当琐碎,并且所有的消息事件都使用与UI系统相同的框架来处理。

怎样定义一个定制信息?

定义一个定制消息相当简单。在UnityEngine.EventSystems命名空间中,有一个名叫“IEventSystemHandler”的接口,从它扩展的接口都会被视为在消息系统中接收事件的目标。

public interface ICustomMessageTarget : IEventSystemHandler
{
// functions that can be called via the messaging system
void Message1();
void Message2();
}


一旦定义了接口,它就能在MonoBehaviour中执行,在运行中,如果给予的消息对应于这个MonoBehaviour游戏物体,对应的函数将会运行。

public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
public void Message1()
{
Debug.Log("Message 1 received");
}

pubic void Message2()
{
Debug.Log("Message 2 received");
}
}


既然有了一段可以接收消息的代码,我们还需要发布消息。通常这会作为对某些发生的、松散联系起来的事件的回应。

例如,在UI系统中,我们为像PointerEnter和PointerExit这样事情发布事件,同样地,对于
4000
进入应用程序的用户输入也有各种其它事件会发生作为回应。

一个静态的帮助类被用来发送消息,它要求一个目标物体(object)、某些用户指定数据,和定义了标出消息接口中你想使用的目标函数的函数声明。

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


这段代码将在所有绑定在游戏物体target上的组件中执行Message1函数,这里的target应该实施了ICustomMessageTarget接口。ExecuteEvents类的文档中包含了其它形式的Execute函数,例如在子类或父类中执行的函数。

输入模块

输入模块设定和改造事件系统的主要逻辑。系统提供两个现成的输入模块可以“开箱即用”,一个设计为独立的,另一个设计为触摸输入。每个模块按照你给定的设置接收并派遣事件。

输入模块是事件系统的“事务逻辑”发生的地方,当事件系统被激活,它会查找什么输入模块被接入,并且传递更新处理(update handling)给相应的模块。

输入模块被设计为可以基于你想支持的输入系统来拓展或改变。它们的目的是把特定的硬件输入(例如触摸板、游戏杆、鼠标和运动控制器)映射为通过消息系统发送的事件。

内置的输入模块被设计用来支持普通游戏设置,例如触摸输入、控制器输入、键盘输入和鼠标输入,当你在MonoBehaviour中实施指定的接口,输入模块会在程序中向控制中心发送发送各种事件。所有的UI组件都实施对所给组件的接口。

支持的事件

事件系统支持许多的事件,并且可以在用户自定义用户输入模块中深入定制这些事件。

接口中提供了独立输入模块和触摸输入模块支持的事件,通过实施接口可以在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 | 当提交按钮按下时调用

ICancelHandler | OnCancel | 当取消按钮按下时调用

光线衍射器(待续。。。)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: