版本:Unity 6 (6000.0)
语言:英语
鼠标事件
面板事件

导航事件

当用户按下方向键、移动操纵杆或按下 EscapeEnter 或箭头键时,导航事件会在运行时发生。它们指示用户正在尝试导航 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
查看 词汇表
,但它们并不局限于特定输入设备,例如键盘。与 焦点 事件的区别在于,导航事件不需要焦点移动到新的 UI 元素。

所有导航事件的基类是 NavigationEventBase.

所有导航事件都会向下层叠、向上冒泡,并且可以取消,但建议在冒泡传播阶段监听这些事件。这是因为导航事件是由可能用于与单个控件交互的输入事件触发的。例如,按钮会对按下 Enter 键的反应进行按钮点击,并且它会取消 NavigationSubmitEvent。在冒泡阶段监听这些事件可以确保它们是导航事件。

事件 描述 向下层叠 向上冒泡 可取消
NavigationMoveEvent 当用户进行移动输入时发送。
NavigationCancelEvent 当用户进行取消输入时发送。
NavigationSubmitEvent 当用户进行提交输入时发送。

事件列表

NavigationMoveEvent

当用户按下方向键、移动操纵杆或按下箭头键时,会发送 NavigationMoveEvent

一些控件会将箭头键用于它们自己的功能。例如,ListView 允许用户使用向上和向下箭头键选择项目。在这种情况下,控件将取消 NavigationMoveEvent,并且事件不会进入冒泡阶段。

direction: 导航的方向。 (None, Left, Up, Right, Down)

move: 移动向量。如果事件是由类似操纵杆的模拟轴输入触发的,则此属性提供对方向向量的访问。

NavigationCancelEvent

当用户取消当前导航操作时,例如通过按下键盘上的 `Escape` 键,会触发 NavigationCancelEvent。重要的是要注意,此事件不会影响当前获得焦点的元素,这意味着在取消之前获得焦点的 UI 元素仍然处于选中状态。

NavigationSubmitEvent

当用户按下提交按钮时,例如通过按下键盘上的 `Enter` 键,会触发 NavigationSubmitEvent

如果控件本身处理事件,它会取消事件,阻止事件进入冒泡阶段。例如,获得焦点的 TextField 将阻止 NavigationSubmitEvent 冒泡。另一方面,可获得焦点的 LabelImage 将允许 NavigationSubmitEvent 冒泡到其父元素,允许它们在需要时处理事件。

示例

以下代码示例演示了如何在运行时 UI 中为导航事件注册回调。

using UnityEngine.UIElements;

public class MyNavigationHandler : MonoBehaviour
{
  void OnEnable()
  {
    // Get a reference to the root visual element
    var uiDocument = GetComponent<UIDocument>();
    var rootVisualElement = uiDocument.rootVisualElement;

    // Register for navigation events
    rootVisualElement.RegisterCallback<NavigationCancelEvent>(OnNavCancelEvent);
    rootVisualElement.RegisterCallback<NavigationMoveEvent>(OnNavMoveEvent);
    rootVisualElement.RegisterCallback<NavigationSubmitEvent>(OnNavSubmitEvent);
  }

  private void OnNavSubmitEvent(NavigationSubmitEvent evt)
  {
    Debug.Log($"OnNavSubmitEvent {evt.propagationPhase}");
  }

  private void OnNavMoveEvent(NavigationMoveEvent evt)
  {
    Debug.Log($"OnNavMoveEvent {evt.propagationPhase} - move {evt.move} - direction {evt.direction}");
  }

  private void OnNavCancelEvent(NavigationCancelEvent evt)
  {
    Debug.Log($"OnNavCancelEvent {evt.propagationPhase}");
  }
}

其他资源

鼠标事件
面板事件