一、EventSystem对象基本属性
当我们在创建一个UI对象时系统会自动给我们创建一个EventSystem对象,在EventSystem对象上有三个组件,EventSysetm、Standalone Input Module、Touch Input Module。
1、EventSystem组件
EventSysetm组件通过结合其他的的组件来实现输入的处理、射线的发射、事件的发送。。一个场景中只能有一个EventSystem组件,并且需要BaseInputModule类型组件的协助才能工作。EventSystem在一开始的时候会把自己所属对象下的BaseInputModule类型组件加到一个内部列表,并且在每个Update周期通过接口UpdateModules接口调用这些基本输入模块的UpdateModule接口,然后BaseInputModule会在UpdateModule接口中将自己的状态修改成’Updated’,之后BaseInputModule的Process接口才会被调用。
2、Touch Input Module 组件 和Standalone Input Module 组件
这两个组件都继承自BaseInputModule类,他们的主要功能是负责发送事件(点击、拖动、选中)到具体的响应对象上StandaloneInputModule和TouchInputModule组件是系统提供的标准输入模块和触摸输入模块,我们可以通过继承BaseInputModule实现自己的输入模块。
在输入管理中分为两个部分状态管理(InputManager)和事件的发送,事件的发送则是根据状态来决定是否发送事件,让对象进行处理。例如当点击按钮时则发送点击事件给具体对象。
Horizontal Axis:水平输入设备
Vertical Axis: 垂直输入设备
Submit Button: 提交按钮事件
Cancel Button:取消按钮事件
Input Action Per Sceond:允许最大每秒事件数
在UI上还有一个隐藏的组件它是BaseRaycaster组件。BaseRaycaster是所有射线类的基类,我们通过发送事件来确定具体响应事件的目标,我们也可以自定义一个继承于BaseRaycaster的类来实现自己的射线类。
总的来说Uinty的事件系统中,EventSystem作为一个管理者,管理各个组件的运行,BaseInputModule负责输入管理,BaseRaycaster负责确定目标对象,目标对象负责接收事件并处理。
注释:在GUI系统中在Canvas对象下我们可以看到GraphicRaycaster组件。如果Canvas的渲染模式是SceenSpace-Overlay,那么我们是看不到Camera组件的。所以GraphicRaycaster代替摄像机在场景中发射射线来确定相应目标。
二、非GUI系统中的事件系统
当我们需要为非GUI对象做事件响应,则我们需要在摄像机上添加一个射线检测组件,通过这个组件从摄像机发射射线来确定目标。
PhysicsRaycaster, Physics2Draycaster这两个组件分别是用于3D和2D的场景。当然,还需要场景的对象挂了collider射线才检测的到。
三、对事件的响应
当我们向具体的目标发送一个事件之后,目标对象则需要对发送过来的事件进行相应的处理。
在GUI中Touch Input Module 组件 和Standalone Input Module 组件组件中定义了一些它自身支持的事件类型,他们只需要重写这些函数,然后将这些函数挂载到相应的目标是,目标对象就能够处理对于的事件了。
鼠标拖动控件移动
鼠标进入控件范围内
当控件被点击时触发,Button组件则内置实现这个函数来实现的。
using UnityEngine;
using System.Collections;
//使用这个命名空间
using UnityEngine.EventSystems;
/*
同时需要继承自IPointerClickHandler类然后重写这个类中的
public void OnPointerClick(PointerEventData eventData)虚函数来实现功能。
函数参数是鼠标当前的位置
*/
public class ImageClilk : MonoBehaviour,IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
print ("OnPointerClick");
}
}
四、将事件处理函数挂在到物体上的方法
1、第一种通过自行创建脚本通过继承的方式实现方法,然后将脚本挂载到物体上,但在这个对象上首先需要有Event System组件
2、在需要处理事件的控件上添加一个组件:
然后选择Add New Event Type添加我们需要处理的事件类型 :
选择之后就可以绑定需要掉用处理这个事件的回调函数就行了。
3、动态添加Event Trigger组件:
在脚本中通过动态添加组件或者修改事件回调函数来事件动态的管理事件回调函数。