版本:Unity 6 (6000.0)
语言:English
平台和网格注意事项
处理文本

UI 工具包输入和事件系统常见问题解答

此页面包含使用事件系统一种根据输入(无论是键盘、鼠标、触摸还是自定义输入)向应用程序中的对象发送事件的方式。事件系统由一些协同工作的组件组成,以发送事件。 更多信息
参见术语表
和输入系统与UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见术语表
工具包的常见问题解答。

  1. 如何知道鼠标是否位于运行时面板中的某个视觉元素之上?
  2. 如何重新映射基本 UI 操作?
  3. 使用方向导航时,如何更改下一个获得焦点的元素?
  4. 是否可以去除方向导航的 WASD 输入或提交操作的空格键?
  5. 如何在不使用鼠标点击的情况下开始输入键盘输入?

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

您可以通过两种方法做到这一点

第一种方法

  1. 在您的场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是分块设计和构建游戏。 更多信息
    参见术语表
    中添加事件系统组件,就像从com.unity.uGUI包创建基于游戏对象的 UI 内容一样。

  2. 使用EventSystem.current.IsPointerOverGameObject方法,如果指针位于来自 uGUI 或 UI 工具包的 UI 内容之上,则该方法返回true

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

  4. 相交的 UI 工具包面板通过游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的函数由附加在其上的组件定义。 更多信息
    参见术语表
    在事件系统的环境中表示。

    • 游戏对象的名称与相应的 PanelSettings 匹配。
    • 游戏对象的父对象是包含当前事件系统组件的游戏对象。
    • 游戏对象有两个组件,PanelRaycasterPanelEventHandler。这两个组件都具有一个panel属性,该属性返回其目标的IPanel

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

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

uGUI 的屏幕坐标系使用左下角为原点,而 UI 工具包的屏幕坐标系则以左上角为原点。两种系统之间的转换需要您使用yTopLeft = Screen.height - yBottomLeft镜像 Y 坐标,反之亦然。

第二种方法

  1. 使用每个不同的 PanelSettings 使用的 UIDocument 的UIDocument.rootVisualElement属性获取可能位于指针下方的所有运行时面板的列表,您可以收集这些面板
  2. 按深度顺序手动遍历面板,并依次对每个面板调用panel.Pick,直到找到返回视觉元素的面板。

如何重新映射基本 UI 操作?

重新映射基本 UI 操作

  1. 在您的场景中添加事件系统组件,就像从com.unity.uGUI包创建基于游戏对象的 UI 内容一样。
  2. 检查器一个 Unity 窗口,显示有关当前选定的游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
    参见术语表
    窗口中,配置独立输入模块输入系统 UI 输入模块字段以控制哪些输入映射到每个操作。

注意:映射到 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.PreventDefault();
});

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

是的。您可以使用检查器窗口中的事件系统的独立输入模块输入系统 UI 输入模块字段来控制哪些输入映射到每个操作。但是,由于这些操作与 uGUI 输入共享,因此这也更改了 uGUI 控件。

要重新映射 UI 工具包输入而不影响 uGUI 控件,请禁用 UI 工具包的运行时事件处理并将所有事件手动发送到面板。为此,在当前事件系统的开始方法(例如场景组件的Awake方法)启动之前,调用EventSystem.SetUITookitEventSystemOverride(null, true, false);。有关此 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()方法。

其他资源

平台和网格注意事项
处理文本