Version: 2023.2
言語: 日本語
マウスイベント
パネルイベント

ナビゲーションイベント

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

NavigationMoveEvent は、ユーザーが D パッドを押すとき、ジョイスティックを動かすとき、矢印キーを押すときに送信されます。

コントロールの中には、独自の機能として矢印キーを使用するものがあります。例えば、ListView を使うと、ユーザーが上下の矢印キーを使って項目を選択することが可能になります。この場合、コントロールは NavigationMoveEvent キャンセルし、イベントはバブルアップの段階に入りません。

direction: ナビゲーションの方向。 (None, Left, Up, Right, Down)

move: 移動ベクトル。イベントがジョイスティックのようなアナログ軸入力によってトリガーされた場合、このプロパティは方向ベクトルへのアクセスを与えます。

NavigationCancelEvent

NavigationCancelEvent は、ユーザーがキーボードの Escape キーを押すなどして、現在のナビゲーションアクションをキャンセルするときにトリガーされます。このイベントは現在フォーカスされている要素には影響しません。つまり、キャンセルされる前にフォーカスされていた UI 要素は選択されたままであることに注意してください。

NavigationSubmitEvent

NavigationSubmitEvent は、ユーザーがキーボードの Enter キーを押すなどして送信ボタンを押すときにトリガーされます。

コントロールが自らイベントを処理する場合、イベントをキャンセルし、バブルアップ段階に入るのを防ぎます。例えば、フォーカスがある 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}");
  }
}

その他の参考資料

マウスイベント
パネルイベント