Unity3D :使用 UI 工具包的输入和事件系统的常见问题解答
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
使用 UI 工具包的输入和事件系统的常见问题解答
本页包含有关使用事件系统
和输入系统用户界面
工具箱。
- 如何知道鼠标是否位于运行时面板中的可视元素上?
- 如何重新映射基本 UI 操作?
- 使用方向导航时,如何更改接下来要关注的元素?
- 是否可以摆脱用于方向导航的 WASD 输入或用于提交操作的空格键?
- 如何在不使用鼠标单击任何地方的情况下开始输入键盘输入?
如何知道鼠标是否位于运行时面板中的可视元素上?
您可以通过两种方法执行此操作:
第一种方法
- 在现场
与从包创建基于游戏对象的 UI 内容的方式相同。com.unity.uGUI
- 使用该方法,如果指针位于来自 uGUI 或 UI 工具包的 UI 内容上,则返回该方法。
EventSystem.current.IsPointerOverGameObjecttrue
- 使用该方法查看内容
EventSystem.current.RaycastAll
视觉元素
在鼠标下方。
相交的 UI 工具包面板在事件系统的环境中通过游戏对象
:
- 游戏对象的名称与相应的面板设置匹配。
- 游戏对象的父级是保存当前事件系统组件的游戏对象。
- 游戏对象有两个组件,和 .这两个组件都有一个返回 it 目标的属性。
PanelRaycasterPanelEventHandlerpanelIPanel
在指针下找到面板后,调用该方法以查找位于指针位置的可视元素。panel.Pick
必须使用 RuntimePanelUtils.ScreenToPanel
方法将指针的屏幕坐标转换为面板坐标。
uGUI 的屏幕坐标系使用左下角的原点,而 UI 工具包的屏幕坐标从左上角表示。两个系统之间的转换需要与 镜像 Y 坐标,反之亦然。yTopLeft = Screen.height - yBottomLeft
第二种方法
- 使用每个不同 PanelSet 的一个 UIDocument 的属性,用于获取指针下的所有运行时面板的列表,您可以收集这些面板
UIDocument.rootVisualElement
- 按深度顺序手动浏览面板,并依次调用每个面板,直到找到返回可视元素的面板。
panel.Pick
如何重新映射基本 UI 操作?
要重新映射基本 UI 操作,请执行以下操作:
- 在场景中添加事件系统组件的方式与从包中创建基于游戏对象的 UI 内容的方式相同。
com.unity.uGUI
- 在检查员
窗口中,配置独立输入模块或输入系统 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建模学习工作室整理翻译,转载请注明出处!