Unity3D :使用 UQuery 查找视觉元素
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
使用 UQuery 查找视觉元素
您可以使用 UQuery 从可视化树
.UQuery 的灵感来自 JQuery 和 Linq,旨在限制动态内存分配。这允许在移动平台上获得最佳性能。
查询方法
您可以通过以下扩展方法使用 UQuery:
Q
Query
在内部,和方法使用 UQueryBuilder
来构造查询。这些扩展方法减少了创建 .QQueryUQueryBuilder
若要使用 UQuery 查找元素,必须先加载并实例化 UXML,然后在根上使用 或 构造选择规则QueryQ
视觉元素
.
Query
返回与选择规则匹配的元素列表。您可以使用 UQueryBuilder
的公共方法过滤返回结果,例如 First、Last、AtIndex、Child 和 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();
以下示例用于查找名为“Ok”的第一个元素:Query
VisualElement result = root.Query("OK").First(); //or VisualElement result = root.Q("OK");
以下示例用于查找名为“Ok”的第一个元素:Q
VisualElement result = root.Q("OK");
下面的示例查找名为“Ok”的第二个元素:
VisualElement result3 = root.Query("OK").AtIndex(1);
下面的示例查找名为“Ok”的最后一个元素:
VisualElement result4 = root.Query("OK").Last();
按USS类查询
要按 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);
注意:只能按元素的实际类型进行查询,而不能按基类进行查询。
使用谓词查询
除了按名称、类和类型查询元素外,还可以使用该方法选择满足谓词的所有元素。谓词必须是采用单个参数的函数回调。WhereVisualElement
下面的示例查找具有“黄色”USS 类且没有工具提示的所有元素:
List<VisualElement> result = root.Query(className: "yellow").Where(elem => elem.tooltip == "").ToList();
复杂的分层查询
可以组合名称、类和类型来进行复杂的分层查询。
下面的示例查找名为“OK”的第一个按钮,该按钮具有“黄色”类:
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 时,请考虑以下事项:
- UQuery 遍历层次结构以按名称、类或类型查找元素。初始化时来自 UQuery 的缓存结果。
- 如果需要检索多个元素,请使用结构(由方法返回)并枚举它以避免创建列表。您还可以构造一次查询并在不同的元素上执行它。
QueryStateelement.Query()
- 用户界面
Toolkit 不会销毁不再需要的可视元素,而是使用 C# 垃圾回收器来收集它们。请注意,不要意外地在类中保留对可视元素的引用,该引用的寿命超过元素来源的 UIDocuments 或 Window。 - 捕获闭包内的变量。
VisualElement
- 创建或释放大量元素时,请启用增量垃圾回收以避免垃圾回收器峰值。
其他资源
- 美国航空母舰选择器
- 视觉元素和可视化树简介
- 从 C# 脚本加载 UXML 和 USS
- 使用 C 实例化 UXML#
由3D建模学习工作室整理翻译,转载请注明出处!