Version: 6000.3
语言: 中文
UI 文档组件
使用 UI Toolkit 的输入和事件系统的常见问题解答

运行时 UI 事件系统和输入处理

UI Toolkit 使用事件系统来处理输入并将事件发送到所有活动面板。此系统处理输入事件并将其发送到 UI 中的相应元素。

当您进入播放模式时,UI Toolkit 会创建一个默认事件系统,该系统不属于任何事件系统场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
和 为大多数输入设备提供基本支持。如果没有其他活动事件系统可以替换该默认事件系统,则使用该默认事件系统。

有关如何使用 EventSystem 组件替换 UI Toolkit 的默认事件系统的更多信息,请参阅 将 UI Toolkit 和 uGUI 与不同的输入系统一起使用

将 UI 工具包与不同的输入系统一起使用

Unity 提供了两个输入处理系统:旧版输入管理器设置(Input Manager Settings) 可在其中为项目定义所有不同的输入轴、按钮和控件。更多信息
请参阅术语表
以及新的输入系统包。输入管理器是核心 Unity 平台的一部分,除非您安装输入系统包,否则它充当默认系统。新的输入系统包提供了更大的灵活性以及更广泛的设备和平台支持。

UI Toolkit 的默认事件系统可以从两个输入系统接收事件。它会自动检测活动输入处理系统并相应地处理事件。

设置主动输入处理系统

要在项目中设置活动输入处理系统,请执行以下作:

  1. 选择 编辑>项目设置(Project Settings) > 播放器(Player) 。

  2. 在 播放器(Player) 窗口的 其他设置(Other Settings) > 配置(Configuration) 下,将 主动输入处理(Active Input Handling) 设置为以下选项之一:

    • 输入管理器(旧版):使用旧版输入管理器。
    • 输入系统包(新版):使用输入系统包。
    • 两者:使用输入系统包(如果可用),否则回退到旧版输入管理器。

如果输入系统包在项目中处于活动状态,则UI Toolkit会自动从输入系统中定义的作派生其事件。要配置这些作,请转到 编辑>项目设置(Project Settings) > 输入系统包(Input System Package) 。

使用输入管理器设置输入处理

要使用输入管理器设置输入处理,请转到 编辑>项目设置(Project Settings) > 输入管理器(Input Manager) 。

输入管理器设置
输入管理器设置

您可以配置水平轴和垂直轴以影响如何NavigationMoveEvents在 UI Toolkit 中生成。您还可以修改“提交”“取消”作以生成NavigationSubmitEventNavigationCancelEvent在 UI 工具包中。

使用输入系统包设置输入处理

要使用输入系统包设置输入处理,请转到 编辑>项目设置(Project Settings) > 输入系统包(Input System Package) 。

输入系统设置
输入系统设置

与输入管理器相比,输入系统包提供了增强的可配置性。您可以使用项目范围的作资产来设置如何NavigationMoveEvents,PointerMoveEvent(“UI/点”作),PointerDownEvent,PointerUpEvent(“UI / 点击”),WheelEvent(“UI / 滚轮”),NavigationSubmitEventNavigationCancelEvent为 UI Toolkit 生成。

有关每个单独作的更多信息,请参阅输入系统包的UI支持文档。

将 UI Toolkit 和 uGUI 与不同的输入系统一起使用

您可以同时使用 UI Toolkit 的 UI 文档和 uGUI 组件。 为此,请通过以下任一方法将 EventSystem 组件添加到场景中:

  • 在“层次结构”视图中,选择“UI”>“事件系统”。
  • 创建任何 uGUI 组件。

将 UI Toolkit 与 EventSystem 组件一起使用时,需要为项目中处于活动状态的输入系统选择适当的输入模块。

下表概述了每个输入系统使用所需的组件和设置:

用法 所需组件 主动输入处理
UI Toolkit 元素与旧版输入管理器 默认事件系统(无需场景组件) 输入管理器(旧)
带有输入系统包的 UI 工具包元素 默认事件系统(无需场景组件) 输入系统包(新)两者兼而有之
UI Toolkit 元素和 uGUI 组件与旧版输入管理器 独立输入模块EventSystem 组件 输入管理器(旧)两者兼而有之
带有输入系统包的 UI 工具包元素和 uGUI 组件 输入系统UI输入模块EventSystem组件 输入系统包(新)两者兼而有之

当您将第一个uGUI元素添加到场景时,事件系统和独立输入模块会自动添加到场景中。

EventSystem 属于 uGUI。它负责通过可互换的输入模块组件从旧版输入管理器或输入系统包派生的 uGUI 事件。

独立输入模块将事件分派到UI Toolkit元素。

在项目中激活输入系统包时,将添加输入系统UI输入模块,而不是独立输入模块输入系统UI输入模块及其随附的事件系统可确保正确调度来自UI工具包和uGUI元素的事件。

事件系统负责读取场景并执行事件,而输入系统UI输入模块则处理输入并启动事件执行。你可以将 独立输入模块(Standalone Input Module) 或 输入系统UI输入模块(Input System UI Input Module) 与其他输入模块一起更改,这可能会改变使用的输入类型。无论使用哪种输入模块,所有事件都通过 EventSystem 执行。

如果您在场景中添加并启用uGUI事件系统,UI Toolkit会检测到它,并为每个UI Toolkit面板创建两个uGUI兼容组件:PanelRaycasterPanelEventHandler.这些组件充当 uGUI 事件和 UI Toolkit 事件之间的中介。这些组件的存在会停用 UI 工具包的自动化内置输入处理。这意味着 UI 工具包依赖于这些组件来处理存在输入事件。

如果场景使用多个面板设置资产,则事件系统会根据其排序顺序将指针事件分派到其面板。UI Toolkit通过将其面板的排序顺序与uGUI画布和其他有效光线投射目标的排序顺序进行比较来确定指针事件的接收者。此过程决定是UI Toolkit元素、uGUI对象还是场景中的另一个对象接收事件。同样,UI Toolkit 使用currentSelectedGameObjectEventSystem 来管理焦点。当 UI 工具包面板想要获得焦点时,它会从其他 uGUI 对象中删除焦点,当 uGUI 对象被选中时,UI 工具包面板会自动失去焦点。

指针事件在面板中传播,直到面板响应它。使用事件影响焦点元素的第一个面板将成为事件系统的焦点面板。此面板将继续接收键盘事件,直到另一个事件导致其他面板成为焦点面板。

注意:停止事件的传播和为元素提供焦点是不同的作。例如,当您单击某个按钮时,它会停止传播,并且仅允许该按钮响应按下,但不会阻止其他默认单击作,例如将焦点放在按钮或任何单击的可聚焦元素上。

在某些情况下,可能需要在处理输入后添加一帧延迟,然后再请求元素的焦点,尤其是当该输入通过其他代码路径影响焦点时,如以下示例所示:

public class FocusOnNextFrameExample : MonoBehaviour
{
    void OnEnable()
    {
        var root = GetComponent<UIDocument>().rootVisualElement;
        root.Q<Button>("my-button").clicked += () =>
        {
            root.schedule.Execute(() => root.Q<TextField>("my-text-field").Focus());
        };
    }
}

其他资源

UI 文档组件
使用 UI Toolkit 的输入和事件系统的常见问题解答