EventSystem物体负责响应玩家与UGUI系统的交互。
如果一个场景中没有EventSystem物体,则玩家无法与UGUI交互。此时点击UGUI的按钮、拖动UGUI的滑动条等操作都不会有任何效果。
创建EventSystem物体的方法:右击Hierarchy窗口——UI——EventSystem。
一个场景中理应最多只能有一个EventSystem物体。如果强行让一个场景中有两个或以上的的EventSystem物体,则Unity的控制台会不断地报警告信息,我们应该避免这种情况的发生。
需要引入命名空间:using UnityEngine.EventSystems;
EventSystem类继承自UIBehaviour类。
EventSystem.current
EventSystem型。
当前场景中找到的第一个EventSystem组件。
EventSystem.SetUITookitEventSystemOverride(EventSystem 要应用的EventSystem对象,bool 应用的EventSystem对象是否会发送UI ToolKit事件=true,bool 是否为没有指定可选择的游戏对象的UI ToolKit面板创建可选择的游戏对象=true)
设置指定的EventSystem对象用于控制UI ToolKit的事件和选择。
如果第一个参数为null,则会将当前场景中可用的的EventSystem对象用于UI ToolKit,如果场景中没有可用的EventSystem,则会将一个默认的EventSystem对象用于UI ToolKit。
如果第二个参数为true,则应用的EventSystem对象会用于发送UI ToolKit事件。如果为false,则会用一个默认的EventSystem对象来发送UI ToolKit事件。
如果第三个参数为true,则没有指定可选择的游戏对象的UI ToolKit面板会在生命周期方法Start中子自动创建可选择的游戏对象。
EventSystem对象.alreadySelecting
bool型,只读。
如果当前正在用鼠标点击或触摸来选中的UGUI控件,则会返回true。一旦成功选中,则会返回false。如果没有选中任何UGUI控件,本变量也会为false。
注意:由于选中的操作往往是一瞬间完成的,所以我们很难观测到本变量为true的情况,绝大部分情况下,本变量都为false。如果要检测当前是否选中了某个UGUI控件,或者要获取当前选中的UGUI控件,则应使用EventSystem对象.currentSelectedGameObject。
EventSystem对象.currentInputModule
BaseInputModule型。
当前使用的基础输入模块。
基础输入模块的作用是从用户的输入设备中捕获事件,并将这些输入事件转化成UGUI的操作事件,从而让用户能够与UGUI的控件进行交互。
EventSystem对象.currentSelectedGameObject
GameObject型。
当前用鼠标点击或触摸所选中的UGUI控件,或通过EventSystem.SetSelectedGameObject方法来选中的UGUI控件。
不是所有UGUI控件都可以通过鼠标点击或触摸选中的,例如点击Button控件可以选中,但是点击Image控件却会被视为取消选中。
如果没有用鼠标点击或触摸任何UGUI控件,则返回null。如果通过鼠标点击或触摸了像Image这样的控件,或者点击或触摸了没有UGUI控件的地方,则都会返回null。
EventSystem对象.firstSelectedGameObject
对应Inspector窗口的First Selected。
GameObject型。
运行游戏场景中,本变量所指定的UGUI控件将成为用户输入的第一个目标。这意味着当用户按下键盘或鼠标时,该游戏对象就会接收到相应的输入事件。
以输入框InputField控件为例,如果把一个InputField控件赋值给本变量,则运行游戏场景后,用户在键盘输入,则输入的字符会显示在该InputField控件上。
EventSystem对象.isFocused
bool型。
当应用程序失去焦点,会停止处理用户的输入,无法与UGUI控件交互,则本变量为false。否则本变量为true。
EventSystem对象.pixelDragThreshold
对应Inspector窗口的Drag Threshold。
int型。
本变量较小,意味着我们拖拽UGUI控件时只需移动较短的距离就视为触发了拖拽操作。
本变量较大,意味着我们拖拽UGUI控件时需要移动较长的距离才视为触发了拖拽操作。
单位是像素。
EventSystem对象.sendNavigationEvents
对应Inspector窗口的Send Navigation Events。
bool型。
是否允许发送用户输入的导航事件。true表示允许,false表示禁止。
注意:这里的导航事件不是指导航系统AI Navigation的事件,这里的导航事件是指移动、提交、取消事件,例子如下:
移动事件:在一个菜单中,用户可以通过键盘方向键或手柄摇杆来移动光标,从而在不同菜单项之间进行切换。
提交事件:在一个确认对话框中,用户可以通过按下确定键或点击“确认”按钮来执行所选的操作。
取消事件:在一个设置面板中,用户可以通过按下取消键来取消当前的更改。
EventSystem对象.IsPointerOverGameObject()
返回bool型。
在当前鼠标光标处发射一条射线进入游戏世界,如果碰到的第一个物体是UGUI控件,且它能接收射线,则返回true,反则返回false。
UGUI控件能否接收射线,则取决于该控件的RaycastTarget参数,打勾则能接收,没打勾则不能接收。
EventSystem对象.IsPointerOverGameObject(int 指定ID的位置)
返回bool型。
在指定ID的位置发射一条射线进入游戏世界,如果碰到的第一个物体是UGUI控件,且它能接收射线,则返回true,反则返回false。
如果不传参数,则默认参数是-1,即在鼠标光标处发射一条射线进入游戏世界。如果要用于检测玩家的触摸,则要传入触摸点的ID。
例如:
void Update()
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began && EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
// 开始触摸,并且从触摸点发射的射线碰到的第一个物体是UGUI控件时,执行这里的逻辑。
}
}
EventSystem对象.RaycastAll(PointerEventData 指定的位置信息,List<RaycastResult> 要存储到的列表)
在屏幕中指定的位置向游戏世界发射一条穿透所有物体的射线,将所有碰到的游戏对象的信息存储到指定的列表中。
EventSystem对象.SetSelectedGameObject(GameObject 要选中的游戏对象)
选中指定的游戏对象。
不但可以选中指定的UGUI控件,也可以选中其它游戏对象。
EventSystem对象.SetSelectedGameObject(GameObject 要选中的游戏对象,BaseEventData 基础事件数据)
选中指定的游戏对象。
不但可以选中指定的UGUI控件,也可以选中其它游戏对象。
EeventSystem对象.UpdateModules()
更新EventSystem对象.currentInputModule的数据。