Unity3D :使用 UI 工具包的输入和事件系统的常见问题解答

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

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

本页包含有关使用事件系统
和输入系统用户界面
工具箱。

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

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

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

第一种方法

  1. 现场
    与从包创建基于游戏对象的 UI 内容的方式相同。com.unity.uGUI
  2. 使用该方法,如果指针位于来自 uGUI 或 UI 工具包的 UI 内容上,则返回该方法。EventSystem.current.IsPointerOverGameObjecttrue
  3. 使用该方法查看内容EventSystem.current.RaycastAll视觉元素
    在鼠标下方。

相交的 UI 工具包面板在事件系统的环境中通过游戏对象
:

  • 游戏对象的名称与相应的面板设置匹配。
  • 游戏对象的父级是保存当前事件系统组件的游戏对象。
  • 游戏对象有两个组件,和 .这两个组件都有一个返回 it 目标的属性。PanelRaycasterPanelEventHandlerpanelIPanel

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

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

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

第二种方法

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

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

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

  1. 在场景中添加事件系统组件的方式与从包中创建基于游戏对象的 UI 内容的方式相同。com.unity.uGUI
  2. 检查员
    窗口中,配置独立输入模块输入系统 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 输入或用于提交操作的空格键?

是的。您可以使用“事件系统”或检查器字段来控制映射到每个操作的输入。但是,由于这些操作与 uGUI 输入共享,因此这也会更改 uGUI 控件。StandaloneInputModuleInputSystemUIInputModule

要在不影响 uGUI 控件的情况下重新映射 UI 工具包输入,请禁用 UI 工具包的运行时事件处理,并将所有事件手动发送到面板。

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

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

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

假设您的脚本被命名为 ,您的初始焦点元素被命名为 。在脚本的方法中,添加一行以聚焦该元素,如下所示:FirstFocusfirst-focusedStart()

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

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

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

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :运行时 UI 的性能注意事项 (mvrlink.com)

下一篇:Unity3D :文本入门 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号