このページでは、UI Toolkit を使用したイベントシステムと入力システムの使用に関してよくある質問を示します。
これは 2 つの方法で行えます。
1 番目の方法
Event System コンポーネントを、com.unity.uGUI パッケージからゲームオブジェクトベースの UI コンテンツを作成するのと同じ方法で、シーンに追加します。
EventSystem.current.IsPointerOverGameObject メソッドを使用します。このメソッドは、uGUI または UI Toolkit の UI コンテンツ上にポインターがある場合、true を返します。
EventSystem.current.RaycastAll メソッドを使用して、マウスの下にあるるビジュアル要素を確認します。
交差する UI Toolkit パネルは、Event System の環境ではゲームオブジェクトによって表されます。
PanelRaycaster と PanelEventHandler の 2 つのコンポーネントを持ちます。どちらのコンポーネントにも、ターゲットとする IPanel を返す panel プロパティがあります。ポインターの下のパネルが分かったら、panel.Pick メソッドを呼び出して、ポインターの位置にあるビジュアル要素を探します。
ポインターのスクリーン座標をパネル座標に変換するには、RuntimePanelUtils.ScreenToPanel メソッドを使用する必要があります。
uGUI のスクリーン座標系が使用する原点は左下ですが、UI Toolkit のスクリーン座標は左上から表現されます。2 つのシステム間の変換では、Y 座標を yTopLeft = Screen.height - yBottomLeft で左右反転する必要があり、その逆も同様です。
2 番目の方法
UIDocument.rootVisualElement プロパティを使用して、ポインターの下にある可能性があるすべての収集可能なランタイムパネルのリストを取得します。panel.Pick を呼び出します。
基本的な UI アクションを再マップするには、次の手順に従います。
com.unity.uGUI パッケージからゲームオブジェクトベースの UI コンテンツを作成するのと同じ方法で、シーンに追加します。ノート: 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();
});
はい。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() メソッドを再度実行する必要があります。