当用户按下方向键、移动操纵杆或按下 Escape
、Enter
或箭头键时,导航事件会在运行时发生。它们指示用户正在尝试导航 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
查看 词汇表,但它们并不局限于特定输入设备,例如键盘。与 焦点 事件的区别在于,导航事件不需要焦点移动到新的 UI 元素。
所有导航事件的基类是 NavigationEventBase.
所有导航事件都会向下层叠、向上冒泡,并且可以取消,但建议在冒泡传播阶段监听这些事件。这是因为导航事件是由可能用于与单个控件交互的输入事件触发的。例如,按钮会对按下 Enter
键的反应进行按钮点击,并且它会取消 NavigationSubmitEvent
。在冒泡阶段监听这些事件可以确保它们是导航事件。
事件 | 描述 | 向下层叠 | 向上冒泡 | 可取消 |
---|---|---|---|---|
NavigationMoveEvent | 当用户进行移动输入时发送。 | ✔ | ✔ | ✔ |
NavigationCancelEvent | 当用户进行取消输入时发送。 | ✔ | ✔ | ✔ |
NavigationSubmitEvent | 当用户进行提交输入时发送。 | ✔ | ✔ | ✔ |
当用户按下方向键、移动操纵杆或按下箭头键时,会发送 NavigationMoveEvent
。
一些控件会将箭头键用于它们自己的功能。例如,ListView 允许用户使用向上和向下箭头键选择项目。在这种情况下,控件将取消 NavigationMoveEvent
,并且事件不会进入冒泡阶段。
direction
: 导航的方向。 (None
, Left
, Up
, Right
, Down
)
move
: 移动向量。如果事件是由类似操纵杆的模拟轴输入触发的,则此属性提供对方向向量的访问。
当用户取消当前导航操作时,例如通过按下键盘上的 `Escape` 键,会触发 NavigationCancelEvent
。重要的是要注意,此事件不会影响当前获得焦点的元素,这意味着在取消之前获得焦点的 UI 元素仍然处于选中状态。
当用户按下提交按钮时,例如通过按下键盘上的 `Enter` 键,会触发 NavigationSubmitEvent
。
如果控件本身处理事件,它会取消事件,阻止事件进入冒泡阶段。例如,获得焦点的 TextField 将阻止 NavigationSubmitEvent
冒泡。另一方面,可获得焦点的 Label 或 Image 将允许 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}");
}
}