【Unity】【UI Toolkit】UQueryBuilderのメソッドを使って検索結果をフィルタリングする

UnityのUI ToolkitのUQueryBuilderのメソッドを使って検索結果をフィルタリングする方法についてまとめました。

Unity 2022.1.17

はじめに

UI Toolkitでは、以下のようにUQueryを使うことでVisualElementを検索できます。

// ボタンを全て検索
var buttons = rootVisualElement.Query<Button>();

このQuery()の戻り値はUQueryBuilder型で、これが持つメソッドを使うことで検索結果をさらにフィルタリングすることができます。

// 最初のボタンを検索
var button = rootVisualElement.Query<Button>().First();

本記事では、このようなUQueryBuilderが持つメソッドを使って検索結果をフィルタリングする方法についてまとめます。

インデックスに応じてフィルタリング

AtIndexメソッドを使うと指定したインデックスのVisualElementだけを取得することができます。
そのインデックスのVisualElementが存在しない場合にはnullを返します。

// Buttonのうち3番目のものを取得する
// なかったらnull
var button = rootVisualElement.Query<Button>().AtIndex(3);

同様に、最初の要素だけ、最後の要素だけを返すメソッドも存在します。

メソッド名 説明
AtIndex 指定したインデックスの要素を返す。
First 最初の要素を返す。
Last 最後の要素を返す。

名前・クラス名・型でフィルタリング

Nameメソッドを使うと、検索結果の中から指定した名前のものをフィルタリングできます。

// ボタンの中から、名前が ExampleButton のものを探す
var button = rootVisualElement.Query<Button>().Name("ExampleButton").First();
Debug.Log(button);

同様に、クラス名や型を指定することもできます。

メソッド名 説明
Name 名前が一致するものを返す。
Class クラス名が一致するものを返す。
OfType 型が一致するものを返す。

VisualElementの状態に応じてフィルタリング

Hoveredメソッドを使うと、検索結果の中からマウスカーソルが乗っているものだけをフィルタリングできます。

// 全てのボタンのうち、マウスカーソルが乗っているものをフィルタリングする
var button = rootVisualElement.Query<Button>().Hovered().First();
Debug.Log(button);

その他、以下のメソッドが用意されています。

メソッド名 説明
Hovered カーソルが乗っているものを返す。
NotHovered カーソルが乗っていないものを返す。
Active ユーザとインタラクションしているものを返す。
NotActive ユーザとインタラクションしていないものを返す。
Focused フォーカスされているものを返す。
NotFocused フォーカスされていないものを返す。
Enabled 有効状態なものを返す。
NotEnabled 無効状態のものを返す。
Checked 選択状態になっているToggleやRadioButtonを返す。また、その他のVisualElementのうち選択状態のものを返す。
NotChecked 未選択状態のものを返す。
Visible 表示状態のものを返す。
NotVisible 非表示状態のものを返す。

子や孫だけフィルタリング

Childrenメソッドを使うと、検索結果の子要素の中から特定の名前や型、クラス名のものをフィルタリングできます。

// Containerの子要素のうち、Buttonを取得する
var button = rootVisualElement.Query("Container").Children<Button>().First();

その他、子や孫以降の全ての配下の要素からフィルタリングできるDescendentsも用意されています。

メソッド名 説明
Children 子要素のうち、指定した名前、型、クラス名を持つものを返す。
Descendents 子要素以下の全ての配下の要素のうち、指定した名前、型、クラス名を持つものを返す。

自由にフィルタリング

自由にフィルタリングを行うにはWhereを使います。

var element = rootVisualElement.Query("Container").Where(x => x.visible).First();

参考

docs.unity3d.com

docs.unity3d.com