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();