Navigation events occur at runtime when the user presses the D-pad, moves a joystick, or presses the Escape
, Enter
or arrow keys. They’re an indicator that the user is trying to navigate the UI, but they’re not limited to a specific input device, such as a keyboard. The difference from a Focus event is that the navigation event doesn’t require the focus to move to a new UI element.
すべてのナビゲーションイベントの基本クラスは NavigationEventBase です。
すべてのナビゲーションイベントでトリクルダウンやバブルアップが行われ、キャンセル可能ですが、バブルアップ伝播の段階でこれらのイベントをリッスンすることを推奨します。これは、ナビゲーションイベントが、個々のコントロールとの相互作用に使われる可能性のある入力イベントによってトリガーされるためです。例えば、ボタンをクリックするとボタンが反応し、Enter
キーが押され、NavigationSubmitEvent
がキャンセルされます。バブルアップの段階でこれらのイベントをリッスンすることにより、ナビゲーションイベントであることが明白になります。
イベント | 説明 | 下降伝播 | 上昇伝播 | キャンセル可能 |
---|---|---|---|---|
NavigationMoveEvent | ユーザが動作入力を行うと送信されます。 | ✔ | ✔ | ✔ |
NavigationCancelEvent | ユーザーがマウスを動かすと送信されます。 | ✔ | ✔ | ✔ |
NavigationSubmitEvent | ユーザが送信入力を行うと送信されます。 | ✔ | ✔ | ✔ |
NavigationMoveEvent
は、ユーザーが D パッドを押すとき、ジョイスティックを動かすとき、矢印キーを押すときに送信されます。
コントロールの中には、独自の機能として矢印キーを使用するものがあります。例えば、ListView を使うと、ユーザーが上下の矢印キーを使って項目を選択することが可能になります。この場合、コントロールは NavigationMoveEvent
キャンセルし、イベントはバブルアップの段階に入りません。
direction
: ナビゲーションの方向。 (None
, Left
, Up
, Right
, Down
)
move
: 移動ベクトル。イベントがジョイスティックのようなアナログ軸入力によってトリガーされた場合、このプロパティは方向ベクトルへのアクセスを与えます。
NavigationCancelEvent
は、ユーザーがキーボードの Escape
キーを押すなどして、現在のナビゲーションアクションをキャンセルするときにトリガーされます。このイベントは現在フォーカスされている要素には影響しません。つまり、キャンセルされる前にフォーカスされていた UI 要素は選択されたままであることに注意してください。
NavigationSubmitEvent
は、ユーザーがキーボードの Enter
キーを押すなどして送信ボタンを押すときにトリガーされます。
コントロールが自らイベントを処理する場合、イベントをキャンセルし、バブルアップ段階に入るのを防ぎます。例えば、フォーカスがある 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}");
}
}