Version: Unity 6.0 (6000.0)
言語 : 日本語
ランタイム UI イベントシステムと入力処理
ランタイム UI のパフォーマンスに関する考慮点

UI Toolkit を使用した入力およびイベントシステムに関する FAQ

このページでは、UI Toolkit を使用したイベントシステムと入力システムの使用に関してよくある質問を示します。

  1. ランタイムパネルでビジュアル要素の上にマウスがあるかどうかを確認するにはどうしたらいいですか?
  2. 基本的な UI アクションを再マップするにはどうしたらいいですか?
  3. 方向ナビゲーションを使用するときに、次にフォーカスする要素を変更するにはどうしたらいいですか?
  4. 方向ナビゲーションの WASD 入力や送信アクションのスペースバーを削除することはできますか?
  5. マウスでどこもクリックせずにキーボード入力を開始するにはどうしたらいいですか?

ランタイムパネルでビジュアル要素の上にマウスがあるかどうかを確認するにはどうしたらいいですか?

これは 2 つの方法で行えます。

1 番目の方法

  1. Event System コンポーネントを、com.unity.uGUI パッケージからゲームオブジェクトベースの UI コンテンツを作成するのと同じ方法で、シーンに追加します。

  2. EventSystem.current.IsPointerOverGameObject メソッドを使用します。このメソッドは、uGUI または UI Toolkit の UI コンテンツ上にポインターがある場合、true を返します。

  3. EventSystem.current.RaycastAll メソッドを使用して、マウスの下にあるるビジュアル要素を確認します。

  4. 交差する UI Toolkit パネルは、Event System の環境ではゲームオブジェクトによって表されます。

    • このゲームオブジェクトの名前は、対応する PanelSettings と同じです。
    • このゲームオブジェクトの親は、現在の Event System コンポーネントを持つゲームオブジェクトです。
    • このゲームオブジェクトは、PanelRaycasterPanelEventHandler の 2 つのコンポーネントを持ちます。どちらのコンポーネントにも、ターゲットとする IPanel を返す panel プロパティがあります。

ポインターの下のパネルが分かったら、panel.Pick メソッドを呼び出して、ポインターの位置にあるビジュアル要素を探します。

ポインターのスクリーン座標をパネル座標に変換するには、RuntimePanelUtils.ScreenToPanel メソッドを使用する必要があります。

uGUI のスクリーン座標系が使用する原点は左下ですが、UI Toolkit のスクリーン座標は左上から表現されます。2 つのシステム間の変換では、Y 座標を yTopLeft = Screen.height - yBottomLeft で左右反転する必要があり、その逆も同様です。

2 番目の方法

  1. PanelSettings ごとに 1 つある UIDocument の UIDocument.rootVisualElement プロパティを使用して、ポインターの下にある可能性があるすべての収集可能なランタイムパネルのリストを取得します。
  2. 手動で深度の順にパネルを移動し、ビジュアル要素を返すパネルが見つかるまで、パネルのそれぞれで連続して panel.Pick を呼び出します。

基本的な UI アクションを再マップするにはどうしたらいいですか?

基本的な UI アクションを再マップするには、次の手順に従います。

  1. Event System コンポーネントを、com.unity.uGUI パッケージからゲームオブジェクトベースの UI コンテンツを作成するのと同じ方法で、シーンに追加します。
  2. Inspector ウィンドウで、Stand alone Input Module または Input System UI Input Module フィールドを設定し、各アクションにマップする入力を制御します。

ノート: Tab と Shift+Tab 入力にマップされたアクションは、Event System の入力モジュールを通じて公開されていないため、再マップできません。

方向ナビゲーションを使用するときに、次にフォーカスする要素を変更するにはどうしたらいいですか?

デフォルト以外のターゲットを持つように方向ナビゲーションを設定できます。

以下のコード例では、上、下、左、右に移動したときにそれぞれ、要素 U、D、L、R に要素 A が移動できるようにします。

A.RegisterCallback <NavigationMoveEvent>(e =>
{
    switch(e.direction)
    {
        case NavigationMoveEvent.Direction.Up: U.Focus(); break;
        case NavigationMoveEvent.Direction.Down: D.Focus(); break;
        case NavigationMoveEvent.Direction.Left: L.Focus(); break;
        case NavigationMoveEvent.Direction.Right: R.Focus(); break;
    }
    e.PreventDefault();
});

方向ナビゲーションの WASD 入力や送信アクションのスペースバーを削除することはできますか?

はい。Inspector ウィンドウの EventSystem の StandaloneInputModule または InputSystemUIInputModule フィールドを使用して、各アクションにマップする入力を制御できます。ただし、これらのアクションは uGUI の入力と共有されるため、uGUI のコントロールも変更されます。

uGUI のコントロールに影響を与えずに UI Toolkit の入力を再マップするには、UI Toolkit のランタイムイベント処理を無効にし、すべてのイベントを手動でパネルに送信します。これを行うには、シーンのコンポーネントの Awake メソッドなど、現在の EventSystem の開始メソッドが開始される前に EventSystem.SetUITookitEventSystemOverride(null, true, false); を呼び出します。この uGUI メソッドの詳細については、SetUITookitEventSystemOverride を参照してください。

マウスでどこもクリックせずにキーボード入力を開始するにはどうしたらいいですか?

ゲームシーンの初回ロード時など、特定の時点でフォーカスされている要素やパネルがない可能性があります。この場合、キーボードナビゲーションは予測可能な最初の要素から開始されません。これは、完全にマウスなしでプレイするゲームでは問題になる可能性があります。

C# スクリプトを追加して、開始から予測可能なナビゲーション動作を可能にし、最初のフォーカスを取得するために選択した要素を担当する UIDocument と同じゲームオブジェクトオブジェクトにスクリプトを設定します。

スクリプトの名前は FirstFocus、最初にフォーカスされる要素の名前は first-focused としています。スクリプトの Start() メソッドで、以下のように要素にフォーカスする行を追加します。

public class FirstFocus : MonoBehaviour
{
    void Start()
    {
        FocusFirstElement();
    }

    public void FocusFirstElement()
    {
        GetComponent<UIDocument>().rootVisualElement.
            Q<VisualElement>("first-focused").Focus();
    }
}

ノート: UIDocument のゲームオブジェクトを無効にすると、その基礎となるすべての階層がゼロから再作成されます。したがって、ゲームオブジェクトを再度有効にした後は、カスタム FocusFirstElement() メソッドを再度実行する必要があります。

追加リソース

ランタイム UI イベントシステムと入力処理
ランタイム UI のパフォーマンスに関する考慮点