您可以使用 UQuery 从 视觉树一个由轻量级节点组成的对象图,包含窗口或面板中的所有元素。它定义了您使用 UI 工具包构建的每个 UI。
参见 术语表 中查找元素。UQuery 的灵感来源于 JQuery 和 Linq,旨在限制动态内存分配。这使得在移动平台上能够获得最佳性能。
您可以通过以下扩展方法使用 UQuery
在内部,Q
和 Query
方法使用 UQueryBuilder
来构建查询。这些扩展方法减少了创建 UQueryBuilder
的冗长性。
要使用 UQuery 查找元素,您必须首先 加载 并 实例化 UXML,然后使用 Query
或 Q
在根 视觉元素视觉树的一个节点,实例化或派生自 C# VisualElement
类。您可以设置外观样式、定义行为并在屏幕上显示它作为 UI 的一部分。 更多信息
参见 术语表 上构建选择规则。
Query
返回与选择规则匹配的元素列表。您可以使用 UQueryBuilder
的公共方法(如 First、Last、AtIndex、Children 和 Where)来筛选 Query
的返回值。
Q
是 Query<T>.First()
的简写形式。它返回与选择规则匹配的第一个元素。
您可以根据其 名称、其 USS 类 或其 元素类型(C# 类型) 查询元素。您还可以使用 谓词 查询或进行 复杂的层次查询。
以下部分使用此示例 UXML 演示如何查找元素
<UXML xmlns="UnityEngine.UIElements">
<VisualElement name="container1">
<Button name="OK" text="OK" />
<Button name="Cancel" text="Cancel" />
</VisualElement>
<VisualElement name="container2">
<Button name="OK" class="yellow" text="OK" />
<Button name="Cancel" text="Cancel" />
</VisualElement>
<VisualElement name="container3">
<Button name="OK" class="yellow" text="OK" />
<Button name="Cancel" class="yellow" text="Cancel" />
</VisualElement>
</UXML>
要按其 名称 查找元素,请使用 Query(name: "element-name")
或 Q(name: "element-name")
。您可以省略 name
,因为它是最早的参数。例如
以下示例查找名为“OK”的元素列表
List<VisualElement> result = root.Query("OK").ToList();
以下示例使用 Query
查找名为“OK”的第一个元素
VisualElement result = root.Query("OK").First(); //or VisualElement result = root.Q("OK");
以下示例使用 Q
查找名为“OK”的第一个元素
VisualElement result = root.Q("OK");
以下示例查找名为“OK”的第二个元素
VisualElement result3 = root.Query("OK").AtIndex(1);
以下示例查找名为“OK”的最后一个元素
VisualElement result4 = root.Query("OK").Last();
要按 USS 类 查找元素,请使用 Query(className: "class-name")
或 Q(className: "class-name")
。
以下示例查找所有具有“yellow”类的元素并将其分配给列表
List<VisualElement> result = root.Query(className: "yellow").ToList();
以下示例查找具有“yellow”类的第一个元素
VisualElement result = root.Q(className: "yellow");
要按其 元素类型(C# 类型)查找元素,请使用 Query<Type>
或 Q<Type>
。
以下示例查找第一个按钮并为其添加工具提示
VisualElement result = root.Q<Button>();
result.tooltip = "This is a tooltip!";
以下示例查找第三个按钮
VisualElement result = root.Query<Button>().AtIndex(2);
注意:您只能按元素的实际类型查询,而不是基类。
除了按名称、类和类型查询元素外,您还可以使用 Where
方法选择满足谓词的所有元素。谓词必须是一个函数回调,它接受一个 VisualElement
参数。
以下示例查找所有具有“yellow”USS 类且没有工具提示的元素
List<VisualElement> result = root.Query(className: "yellow").Where(elem => elem.tooltip == "").ToList();
您可以组合名称、类和类型来进行复杂的层次查询。
以下示例查找名为“OK”且具有“yellow”类的第一个按钮
VisualElement result = root.Query<Button>(className: "yellow", name: "OK").First();
以下示例查找“container2”的子级取消按钮
VisualElement result = root.Query<VisualElement>("container2").Children<Button>("Cancel").First();
您可以使用 ForEach 方法直接对查询结果进行操作。
以下示例为任何没有工具提示的元素添加工具提示
root.Query().Where(elem => elem.tooltip == "").ForEach(elem => elem.tooltip="This is a tooltip!");
在使用 UQuery 时,请考虑以下几点
QueryState
结构体(由 element.Query()
方法返回)并对其进行枚举以避免创建列表。您还可以构建一次查询并在不同的元素上执行它。VisualElement
变量。