Version: 6000.3
语言: 中文
运行时 UI 事件系统和输入处理
世界空间UI

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

此页面包含有关使用事件系统一种根据输入(无论是键盘、鼠标、触摸还是自定义输入)向应用程序中的对象发送事件的方法。事件系统由几个组件组成,这些组件协同工作以发送事件。更多信息
请参阅术语表
以及带有 UI Toolkit 的输入系统。

  1. 如何知道鼠标是否位于运行时面板中的视觉元素上?
  2. 如何重新映射基本 UI作?
  3. 使用定向导航时,如何更改接下来要关注的元素?
  4. 是否可以删除提交作的方向导航或空格键的 WASD 输入?
  5. 如何在不用鼠标单击任何位置的情况下开始输入键盘输入?

如何知道鼠标是否位于运行时面板中的视觉元素上?

您可以通过两种方法执行此作:

第一种方法

  1. 场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您可以放置环境、障碍物和装饰,实质上是分批设计和构建游戏。更多信息
    请参阅术语表
    与从com.unity.uGUI包。

  2. 使用EventSystem.current.IsPointerOverGameObject方法,返回true如果指针位于 uGUI 或 UI Toolkit 中的 UI 内容上。

  3. 使用EventSystem.current.RaycastAll方法来查看鼠标下方的视觉元素

  4. 相交的UI工具包面板在事件系统的环境中通过游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
    请参阅术语表
    :

    • 游戏对象的名称与相应的 PanelSettings 匹配。
    • 游戏对象的父级是保存当前事件系统组件的游戏对象。
    • GameObject 有两个组件:PanelRaycasterPanelEventHandler. 这两个组件都有一个panel返回IPanel它有针对性。

找到指针下方的面板后,调用panel.Pick方法来查找指针位置的视觉元素。

您必须使用RuntimePanelUtils.ScreenToPanel将指针的屏幕坐标转换为面板坐标的方法。

uGUI 的屏幕坐标系使用左下角原点,而 UI Toolkit 屏幕坐标从左上角表示。两个系统之间的转换需要您镜像 Y 坐标yTopLeft = Screen.height - yBottomLeft,反之亦然。

第二种方法

  1. 使用UIDocument.rootVisualElement每个不同的 PanelSettings 中的一个 UIDocument 属性,用于获取指针下可能存在的所有运行时面板的列表,您可以收集这些列表
  2. 按深度顺序手动浏览面板并调用panel.Pick在它们中的每一个上连续进行,直到您找到一个返回视觉元素的元素。

如何重新映射基本 UI作?

要重新映射基本 UI作,请执行以下作:

  1. 在场景中添加事件系统组件的方式与从com.unity.uGUI包。
  2. 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
    请参阅术语表
    窗口中,配置 独立输入模块(Stand alone Input Module) 或 输入系统UI输入模块(Input System UI Input Module) 字段,以控制映射到每个作的输入。

注意:映射到 Tab 和 Shift+Tab 输入的作无法重新映射,因为它们不会通过事件系统输入模块公开。

使用定向导航时,如何更改接下来要关注的元素?

您可以将定向导航配置为具有默认目标以外的其他目标。

以下代码示例允许元素 A 在分别向上、向下、向左和向右导航时导航到元素 U、D、L、R:

A.RegisterCallback <NavigationMoveEvent>(e =>
{
    switch(e.direction)
    {
        case NavigationMoveEvent.Direction.Up: U.Focus(); break;
        case NavigationMoveEvent.Direction.Down: D.Focus(); break;
        case NavigationMoveEvent.Direction.Left: L.Focus(); break;
        case NavigationMoveEvent.Direction.Right: R.Focus(); break;
    }
    e.StopPropagation(); // Prevent further processing of the event
    A.focusController.IgnoreEvent(e); // Prevent default navigation
});

是否可以删除提交作的方向导航或空格键的 WASD 输入?

是的。你可以在 Inspector 窗口中使用 EventSystem 的 StandaloneInputModuleInputSystemUIInputModule 字段来控制映射到每个作的输入。但是,由于这些作与 uGUI 输入共享,因此这也更改了 uGUI 控件。

要在不影响uGUI控件的情况下重新映射UI Toolkit输入,请禁用UI Toolkit的运行时事件处理,并手动将所有事件发送到面板。为此,请调用EventSystem.SetUITookitEventSystemOverride(null, true, false);在当前 EventSystem 的 start 方法启动之前,例如Awake场景组件的方法。有关此 uGUI 方法的详细信息,请参阅 SetUITookitEventSystemOverride

如何在不用鼠标单击任何位置的情况下开始输入键盘输入?

在给定时间可能没有元素或面板处于焦点中,例如首次加载游戏场景时。在这种情况下,键盘导航不会从可预测的第一个元素开始。对于完全没有鼠标玩的游戏来说,这可能是一个问题。

若要从一开始就允许可预测的导航行为,请添加 C# 脚本,并将其附加到与负责选择获取初始焦点的元素的 UIDocument 相同的游戏对象。

假设脚本名为FirstFocus初始焦点元素命名为first-focused.在脚本的Start()方法中,添加一行以聚焦该元素,如下所示:

public class FirstFocus : MonoBehaviour
{
    void Start()
    {
        FocusFirstElement();
    }

    public void FocusFirstElement()
    {
        GetComponent<UIDocument>().rootVisualElement.
            Q<VisualElement>("first-focused").Focus();
    }
}

注意:如果禁用 UIDocument 的游戏对象,则会从头开始重新创建其所有底层结构。因此,您必须运行自定义FocusFirstElement()方法。

其他资源

运行时 UI 事件系统和输入处理
世界空间UI