Unity EventSystem类、EventSystem物体
LuJack
编辑于 2023年12月28日 10:57
收录于文集
共90篇

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的数据。