包含此页的版本:
不含此页的版本:
此页面包含有关使用事件系统一种根据输入(无论是键盘、鼠标、触摸还是自定义输入)向应用程序中的对象发送事件的方法。事件系统由几个组件组成,这些组件协同工作以发送事件。更多信息
请参阅术语表以及带有 UI Toolkit 的输入系统。
您可以通过两种方法执行此作:
第一种方法
在场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您可以放置环境、障碍物和装饰,实质上是分批设计和构建游戏。更多信息
请参阅术语表与从com.unity.uGUI包。
使用EventSystem.current.IsPointerOverGameObject方法,返回true如果指针位于 uGUI 或 UI Toolkit 中的 UI 内容上。
使用EventSystem.current.RaycastAll方法来查看鼠标下方的视觉元素。
相交的UI工具包面板在事件系统的环境中通过游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表:
PanelRaycaster和PanelEventHandler. 这两个组件都有一个panel返回IPanel它有针对性。找到指针下方的面板后,调用panel.Pick方法来查找指针位置的视觉元素。
您必须使用RuntimePanelUtils.ScreenToPanel将指针的屏幕坐标转换为面板坐标的方法。
uGUI 的屏幕坐标系使用左下角原点,而 UI Toolkit 屏幕坐标从左上角表示。两个系统之间的转换需要您镜像 Y 坐标yTopLeft = Screen.height - yBottomLeft,反之亦然。
第二种方法
UIDocument.rootVisualElement每个不同的 PanelSettings 中的一个 UIDocument 属性,用于获取指针下可能存在的所有运行时面板的列表,您可以收集这些列表panel.Pick在它们中的每一个上连续进行,直到您找到一个返回视觉元素的元素。要重新映射基本 UI作,请执行以下作:
com.unity.uGUI包。注意:映射到 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
});
是的。你可以在 Inspector 窗口中使用 EventSystem 的 StandaloneInputModule 或 InputSystemUIInputModule 字段来控制映射到每个作的输入。但是,由于这些作与 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()方法。