此页面包含使用事件系统一种根据输入(无论是键盘、鼠标、触摸还是自定义输入)向应用程序中的对象发送事件的方式。事件系统由一些协同工作的组件组成,以发送事件。 更多信息
参见术语表和输入系统与UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见术语表 工具包的常见问题解答。
您可以通过两种方法做到这一点
第一种方法
在您的场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是分块设计和构建游戏。 更多信息
参见术语表中添加事件系统组件,就像从com.unity.uGUI
包创建基于游戏对象的 UI 内容一样。
使用EventSystem.current.IsPointerOverGameObject
方法,如果指针位于来自 uGUI 或 UI 工具包的 UI 内容之上,则该方法返回true
。
使用EventSystem.current.RaycastAll
方法查看鼠标下方的视觉元素。
相交的 UI 工具包面板通过游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的函数由附加在其上的组件定义。 更多信息
参见术语表在事件系统的环境中表示。
PanelRaycaster
和PanelEventHandler
。这两个组件都具有一个panel
属性,该属性返回其目标的IPanel
。找到指针下的面板后,调用panel.Pick
方法查找位于指针位置的视觉元素。
您必须使用RuntimePanelUtils.ScreenToPanel
方法将指针的屏幕坐标转换为面板坐标。
uGUI 的屏幕坐标系使用左下角为原点,而 UI 工具包的屏幕坐标系则以左上角为原点。两种系统之间的转换需要您使用yTopLeft = Screen.height - yBottomLeft
镜像 Y 坐标,反之亦然。
第二种方法
UIDocument.rootVisualElement
属性获取可能位于指针下方的所有运行时面板的列表,您可以收集这些面板panel.Pick
,直到找到返回视觉元素的面板。重新映射基本 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();
});
是的。您可以使用检查器窗口中的事件系统的独立输入模块或输入系统 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()
方法。