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建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :从 C# 脚本实例化 UXML (mvrlink.com)

下一篇:Unity3D :使用 C# 脚本构建 UI (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号