当用户按下 D 形键盘、移动游戏杆或按下 Escape、Enter 或箭头键时,导航事件发生在运行时。它们是用户尝试导航__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary 的标志,但不仅限于特定的输入设备(例如键盘)。与焦点事件的区别在于,导航事件不需要将焦点移动到新的 UI 元素。
所有导航事件的基类是 NavigationEventBase。
所有导航事件都会涓滴、冒泡并可以取消,但建议在冒泡传播阶段监听这些事件。这是因为导航事件由输入事件触发,输入事件也可能用于与各个控件交互。例如,一个按钮将对按下 Enter 键并单击按钮做出反应,并取消 NavigationSubmitEvent。在冒泡阶段监听这些事件可确保它们是导航事件。
| 事件 | 描述 | 涓滴 | 冒泡 | 可取消 |
|---|---|---|---|---|
| NavigationMoveEvent | 在用户进行移动输入时发送。 | ✔ | ✔ | ✔ |
| NavigationCancelEvent | 在用户进行取消输入时发送。 | ✔ | ✔ | ✔ |
| NavigationSubmitEvent | 在用户进行提交输入时发送。 | ✔ | ✔ | ✔ |
当用户按下 D 形键盘、移动游戏杆或按下箭头键时发送 NavigationMoveEvent。
某些控件将使用箭头键来实现自己的功能。例如,ListView 允许用户使用向上和向下箭头键来选择项目。在这种情况下,控件将取消 NavigationMoveEvent,并且事件不会进入冒泡阶段。
direction:导航的方向。(None、Left、Up、Right、Down)
move:移动矢量。如果事件是由模拟轴输入(例如游戏杆)触发的,则此属性允许访问方向矢量。
当用户取消当前导航操作(例如按键盘上的 `Escape`` 键)时触发 NavigationCancelEvent。必须注意,此事件不会影响当前获得焦点的元素,这意味着在取消之前获得焦点的 UI 元素保持选中状态。
当用户按下提交按钮(例如按下键盘上的 `Enter`` 键)时触发 NavigationSubmitEvent。
如果控件自己处理事件,则会取消事件,防止其进入冒泡阶段。例如,具有焦点的 TextField 将阻止 NavigationSubmitEvent 冒泡。另一方面,可聚焦的标签或图像将允许 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}");
}
}