版本:Unity 6 (6000.0)
语言:English
从 C# 脚本实例化 UXML
使用 C# 脚本构建 UI

使用 UQuery 查找视觉元素

您可以使用 UQuery视觉树一个由轻量级节点组成的对象图,包含窗口或面板中的所有元素。它定义了您使用 UI 工具包构建的每个 UI。
参见 术语表
中查找元素。UQuery 的灵感来源于 JQuery 和 Linq,旨在限制动态内存分配。这使得在移动平台上能够获得最佳性能。

查询方法

您可以通过以下扩展方法使用 UQuery

在内部,QQuery 方法使用 UQueryBuilder 来构建查询。这些扩展方法减少了创建 UQueryBuilder 的冗长性。

要使用 UQuery 查找元素,您必须首先 加载实例化 UXML,然后使用 QueryQ 在根 视觉元素视觉树的一个节点,实例化或派生自 C# VisualElement 类。您可以设置外观样式、定义行为并在屏幕上显示它作为 UI 的一部分。 更多信息
参见 术语表
上构建选择规则。

Query 返回与选择规则匹配的元素列表。您可以使用 UQueryBuilder 的公共方法(如 FirstLastAtIndexChildrenWhere)来筛选 Query 的返回值。

QQuery<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 类查询

要按 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 时,请考虑以下几点

  • UQuery 遍历层次结构以按名称、类或类型查找元素。在初始化时缓存 UQuery 的结果。
  • 如果您需要检索多个元素,请使用 QueryState 结构体(由 element.Query() 方法返回)并对其进行枚举以避免创建列表。您还可以构建一次查询并在不同的元素上执行它。
  • UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
    参见 术语表
    工具包不会销毁不再需要的视觉元素,它使用 C# 垃圾回收器来收集它们。请注意,不要意外地在超出 UIDocuments 或 Window(元素来自其中)生命周期的类中保留对视觉元素的引用。
  • 在闭包内捕获 VisualElement 变量。
  • 当您创建或释放大量元素时,启用 增量垃圾回收 以避免垃圾回收器峰值。

其他资源

从 C# 脚本实例化 UXML
使用 C# 脚本构建 UI