ナビゲーションイベントは、ユーザーが D パッドを押したとき、ジョイスティックを動かしたとき、Escape、Enter、方向キーを押したときにランタイムに発生します。ユーザーが UI を操作しようとしていることを示すインジケーターですが、キーボードなどの特定の入力デバイスに限定されません。フォーカス イベントとの違いは、ナビゲーションイベントは新しい UI 要素にフォーカスを移動する必要がないことです。
すべてのナビゲーションイベントの基本クラスは 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}");
}
}