UI 工具包使用一个事件系统一种基于输入(无论是键盘、鼠标、触摸还是自定义输入)向应用程序中的对象发送事件的方式。事件系统由一些协同工作的组件组成,以发送事件。更多信息
参见术语表来处理输入并将事件发送到所有活动面板。此系统处理输入事件并将它们发送到UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。更多信息
参见术语表中的相应元素。
Unity 提供两种输入处理系统:旧版输入管理器可以在其中定义项目的所有不同输入轴、按钮和控件的设置。更多信息
参见术语表和新的输入系统包。输入管理器是核心 Unity 平台的一部分,除非您安装输入系统包,否则它将作为默认系统。新的输入系统包提供了更大的灵活性和更广泛的设备和平台支持。
UI 工具包的事件系统可以接收来自这两个系统的事件。该系统会自动检测活动输入处理系统并相应地处理事件。
要在项目中设置活动输入处理系统
选择编辑 > 项目设置 > 播放器。
在播放器窗口中,在其他设置 > 配置下,将活动输入处理设置为以下选项之一
如果输入系统包在您的项目中处于活动状态,则 UI 工具包会自动从输入系统中定义的操作派生其事件。要配置这些操作,请转到编辑 > 项目设置 > 输入系统包。
要使用输入管理器设置输入处理,请转到编辑 > 项目设置 > 输入管理器。
您可以配置水平和垂直轴以影响如何在 UI 工具包中生成NavigationMoveEvents
。您还可以修改提交和取消操作以在 UI 工具包中生成NavigationSubmitEvent
和NavigationCancelEvents
。
要使用输入系统包设置输入处理,请转到编辑 > 项目设置 > 输入系统包。
与输入管理器相比,输入系统包提供了增强的可配置性。您可以使用项目范围的操作资源来设置如何为 UI 工具包生成NavigationMoveEvents
、PointerMoveEvent
(“UI / 指针”操作)、PointerDownEvent
、PointerUpEvent
(“UI / 点击”)、WheelEvent
(“UI / 滚轮”)、NavigationSubmitEvent
和NavigationCancelEvent
。
您可以同时使用 UI 工具包的 UI 文档和 uGUI 组件。当您将 UI 工具包(和 uGUI)与不同的输入系统一起使用时,您需要选择合适的输入模块。
下表概述了每个输入系统用法所需的组件和设置
用法 | 所需组件 | 活动输入处理 |
---|---|---|
带有旧版输入管理器的 UI 工具包元素 | 默认事件系统(无需场景组件) | 输入管理器(旧版) |
带有输入系统包的 UI 工具包元素 | 默认事件系统(无需场景组件) | 输入系统包(新版)或两者 |
带有旧版输入管理器的 UI 工具包元素和 uGUI 组件 | 一个独立输入模块和一个EventSystem组件 | 输入管理器(旧版)或两者 |
带有输入系统包的 UI 工具包元素和 uGUI 组件 | 一个输入系统 UI 输入模块和一个EventSystem组件 | 输入系统包(新版)或两者 |
当您将第一个 uGUI 元素添加到场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,从本质上讲是分段设计和构建游戏。更多信息
参见术语表时,一个EventSystem和一个Standalone Input Module将自动添加到场景中。
EventSystem属于 uGUI。它负责 uGUI 事件,这些事件来自旧版输入管理器或输入系统包,通过一个可互换的输入模块组件。
Standalone Input Module将事件分派到 UI 工具包元素。
当您在项目中激活输入系统包时,会添加Input System UI Input Module而不是Standalone Input Module。Input System UI Input Module及其附带的EventSystem确保来自 UI 工具包和 uGUI 元素的事件都得到正确分派。
EventSystem负责读取场景并执行事件,而Input System UI Input Module处理输入并启动事件执行。您可以将Standalone Input Module或Input System UI Input Module与其他输入模块一起更改,这可以更改消耗的输入类型。无论使用哪个输入模块,所有事件都将通过EventSystem执行。
如果在场景中添加并启用了 uGUI EventSystem,则 UI 工具包会检测到它并为每个 UI 工具包面板创建两个与 uGUI 兼容的组件:PanelRaycaster
和PanelEventHandler
。这些组件充当 uGUI 事件和 UI 工具包事件之间的中介。这些组件的存在会停用 UI 工具包的自动内置输入处理。这意味着当这些组件存在时,UI 工具包依赖于它们来处理输入事件。
如果场景使用多个面板设置资源,则事件系统会根据其排序顺序将其指针事件分派到其面板。UI 工具包通过将其面板的排序顺序与 uGUI 画布和其他有效射线投射目标的排序顺序进行比较来确定指针事件的接收者。此过程决定是 UI 工具包元素、uGUI 对象还是场景中的其他对象接收事件。类似地,UI 工具包使用EventSystem的currentSelectedGameObject
来管理焦点。当 UI 工具包面板想要获得焦点时,它会从其他 uGUI 对象中移除焦点,而当 uGUI 对象被选中时,UI 工具包面板会自动失去焦点。
指针事件会通过面板传播,直到某个面板对其做出响应。第一个使用事件影响焦点元素的面板将成为事件系统的焦点面板。此面板将继续接收键盘事件,直到另一个事件导致不同的面板成为焦点面板。
注意:停止事件的传播和使元素获得焦点是不同的操作。例如,当您单击按钮时,它会停止传播并仅允许按钮响应按下,但它不会阻止其他默认点击操作,例如使按钮或任何被单击的可聚焦元素获得焦点。