Version: 6000.3
语言: 中文
文本查询引用
其他搜索过滤器

搜索表达式

搜索表达式允许您添加到搜索查询语言中,以表达交叉引用多个提供程序的复杂查询,例如,搜索场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
使用着色器在 GPU 上运行的程序。更多信息
请参阅术语表
这不会编译。

搜索表达式可以链接在一起,以转换或对搜索项执行设置作。

如何使用搜索表达式

“搜索”窗口中输入搜索表达式以返回结果:

搜索表达式 count{a:assets} 的结果
搜索表达式的结果count{a:assets}

如果使用的是可视化查询生成器,请将其关闭以输入搜索表达式。切换开关位于搜索字段旁边。

文本查询旁边的“切换查询生成器模式”按钮
文本查询旁边的“切换查询生成器模式”按钮

创建搜索表达式

搜索表达式以可以包含内部表达式的根表达式开头。

一个简单的查询,例如t:shader是一种表达。它返回与项目中着色器对应的所有搜索项。

使用搜索表达式语言将多个查询组合到单个表达式中,以创建更灵活的搜索。

搜索表达式支持以下内容:

  • 查询:t:shader
  • 使用嵌套表达式的查询:t:prefab ref={t:texture}
  • 功能:count{t:shader}
  • 字面:3"this is a string literal"
  • 属性选择器:@path or @mesh(任何以开头的标识符都假定为从搜索项中提取值的选择器。选择器可以查找对象的属性或用于动态计算结果)@

所有搜索表达式都返回一组搜索项 (IEnumerable<SearchItem>).作为一般准则,搜索表达式语言使用大括号来表示一组项。甚至字面表达式,例如{}3在内部评估为一组:{3}.

搜索表达式可以链接在一起以进行更复杂的查询:

  • t:prefab ref={t:texture}
    • t:texture查询的一部分查找项目中的所有纹理
    • t:prefab ref=查询的一部分对 t:texture 集中返回的每个纹理运行查询,以查看哪个预制件一种资产类型,允许您存储包含组件和属性的游戏对象。预制件充当模板,你可以从中在场景中创建新的对象实例。更多信息
      请参阅术语表
      参考这个纹理。
  • t:prefab ref={t:texture size>4000}:查找纹理大小大于 4000 字节的项目中的所有预制件。

这相当于:

  • 运行t:texture size>4000返回项目中所有 4K 纹理的列表(例如,armor.png,treasure.png).

  • 运行t:prefab ref=<one of the 4K textures>(例如,t:prefab ref=armor.png然后t:prefab ref=treasure.png).

  • 聚合所有结果并将其作为搜索项的单个列表返回。

  • t:[shader, material, texture]:查找类型为shader,materialtexture.使用普通查询,它可以表示为:

  • t:shader or t:material or t:texture

功能

Unity 有一个搜索表达式函数库,用于作和转换搜索项集。这些函数中的每一个都可以接受多个参数并返回一组项。Unity 搜索表达式使用大括号来表示函数调用。

所有功能的完整列表在这里

示例:函数计数对作为参数传递的每个集合的项目进行计数,并返回一个数字。

  • count{t:shader}:返回一个包含项目中着色器数量的集合。例:{34}.
  • count{t:shader, t:texture}:返回一个包含项目中着色器和纹理数量的集合。例:{34, 2048}.

函数可以链接在一起,类似于 LISP 编程语言中使用的 s 表达式

注意:只能有一个根表达式。

按作顺序计算的函数链示例:

print{"path=@path", first{10, sort{t:texture, @size}}}打印项目中 10 个最大纹理的路径

  1. t:texture:查找项目中的所有纹理,然后选择“大小”属性。
  2. sort{ t:texture, @size}:根据它们的大小属性对所有这些纹理进行排序。
  3. first{10:选择前 10 个排序纹理。
  4. print{ "path=@path":根据格式字符串在控制台中打印此列表,其中 Unity Search 提取每个结果项的 path 属性path=@path.

函数可以具有多个签名(方法名称及其每个形式参数的类型和类型(值、引用或输出),类似于 C#),并且可以支持可选(不需要传递给函数的参数)和可变参数(可以接受可变数量的参数)参数。

搜索表达式中的文字

文本是您要搜索的实际单词或数字,或者您要检索的数字金额,而不是查询字符串。例如,t:texture 搜索类型名称中带有纹理的资产(例如,Texture2D),但添加引号使其成为文字,“t:texture”搜索名为 t:texture 的资产。

表达 描述
文字数 (1,2,3, and so on)
设置 方括号 ([ ])
字符串 单引号或双引号(或''"")

数字文字可以用作函数的参数(例如first).

first{10, t:shader} -> {the first 10 shaders return by the 't:shader' query}

设置

使用方括号表示一组值。集合可以包含任何类型的表达式,但搜索表达式解析器将假定集合的元素是文字而不是搜索查询。[]

例:

[t:shader, hello, 3] -> ["t:shader", "hello", 3]

如果使用大括号 (),解析器会将其视为三个查询:{}

{t:shader, hello, 3}-> {<运行 t:shader 的查询>,<运行 hello> 的查询,<运行 3> 的查询}

字符串

字符串文字可以用作某些函数的参数(例如format).您可以使用单引号或双引号指定字符串文字:

“你好”或“你好”

将格式字符串作为参数的格式函数:

format{t:texture, '@path (@size)'}

属性选择器和搜索项值

选择器是使用前缀表示的标识符。使用选择器访问项的属性,以便进行计算、筛选或格式化。选择器可以映射到 UnityEngine.Object 的序列化属性或自定义函数,以允许访问动态数据。@

任何搜索项支持的基本选择器包括:

  • id:根据其搜索提供程序,此项目的唯一 ID。
  • value:项目的内部值。默认情况下,它是它的 ID,但函数可以覆盖项目的值。
  • label: 项目标签,如“搜索”窗口中所示
  • descdescription:项目描述(“搜索”窗口的第二行)

Unity 还为搜索项定义了通用选择器,例如:

  • @name: UnityEngine.Object.name
  • @size:资产的磁盘文件大小
  • @path:资产路径
  • @extension:资产文件扩展名
  • @provider:已生成此项目的搜索提供程序

要访问搜索项的特定属性以执行作,请使用选择器:

  • count{t={distinct{select{a:assets, @type}}}}
    • a:assets, @type查找项目中的所有资产,然后选择type属性。
    • distinct返回存在的所有类型的列表。
    • t={list of types}返回每种类型的每个资产的多个列表。
    • count计算项目中每种类型的资产数量。
  • avg{@size,t:shader}
    • t:shader, @size:查找所有着色器,然后选择 size 属性。
    • avg:计算项目中所有着色器的平均大小。
  • print{@value, count{t:texture, t:material}}
    • 这将打印从 count 函数的结果中提取的 count 值控制台窗口Unity 编辑器窗口,显示 Unity 或您自己的脚本生成的错误、警告和其他消息。更多信息
      请参阅术语表
      .

选择器查找序列化属性和材料属性:@#

  • sort{t:texture, @#height}:按其高度序列化属性的顺序对所有纹理进行排序。

名称搜索表达式(别名)

您可以命名搜索表达式,使其更易于在“搜索”窗口中显示。

例如,输入表达式sort{count{t:audio, t:texture}, @value,desc}搜索窗口中,可能很难读取哪个计数对应于哪种类型:

两个结果,均称为 Count
两个结果,均称为 Count

使用别名:sort{count{t:audio as Audio, t:texture as Texture}, desc}产生更具可读性的结果:

一个结果称为 纹理(Texture),另一个结果称为 音频(Audio)
一个结果称为 纹理(Texture),另一个结果称为 音频(Audio)

要动态生成别名,请使用alias功能。例如:

alias{[1, 2, 3], 'Title value'}

将产生带有以下标签的项目:

{Title 1, Title 2, Title 3}

alias 函数为结果提供了标签 Title 1、Title 2 和 Title 3
alias 函数为结果提供了标签 Title 1、Title 2 和 Title 3

展开运算符

expand 运算符...允许将一组项分组为多组项,而不仅仅是一组项。

...{expandable expression} -> {sub expr 1} {sub expr 2} {sub expr N}

例:

一个小型项目有 3 个预制件、4 个纹理和 5 个着色器。以下表达式提供所有计数:

count{t:[prefab, texture, shader]} -> {12}

搜索表达式的结果t:[prefab, texture, shader]是 12 个类型预制件、纹理和着色器的项的统一列表。这也可以表示为:t:prefab or t:texture or t:shader.

使用展开运算符分别计算每种资产类型的数量:

count{...t:[prefab, texture, shader]} -> count{t:prefab, t:texture, t:shader} -> {3, 4, 5}

groupBy 函数可以与 expand 运算符一起使用,以返回按公共键分组的项集。

例:

一个项目具有三种类型的资源(预制件、纹理和着色器)。对于选择器@type返回搜索项的类型,则表达式将扩展为:

count{t:prefab or t:texture or t:shader}

您可以使用groupBy函数按类型对项目进行分组,然后计算每种类型的每个项目数量:

count{...groupBy{t:prefab or t:texture or t:shader, @type}}

搜索表达式示例

这些示例演示了如何将搜索表达式用于项目中的复杂请求。

  • 计算场景中的预制件使用情况并按最高使用率排序:

    sort{select{p: t:prefab *.prefab, @path, count{t:scene ref:@path} as count}, @count, desc}

  • 对所有资产类型进行排序和计数

    sort{count{...groupby{a:assets, @type}}, @value, desc}

  • 找到meshUnity 的主要图形原语。网格体构成了 3D 世界的很大一部分。Unity 支持三角或四边形多边形网格。Nurbs、Nurms、Subdiv 曲面必须转换为多边形。更多信息
    请参阅术语表
    顶点最多(假设项目中可用@vertices选择器)。

    first{sort{t:mesh, @vertices, desc}}

  • 按顶点计数对所有网格进行排序

    sort{select{h: t:mesh, @path, @vertices}, @vertices, desc}

  • 计算所有网格的顶点数

    sum{select{h:t:mesh, @vertices}}

  • 查找引用网格的所有资产

    ref=select{p:t:mesh, @path}

  • 列出预制件场景引用计数

    select{p: *.prefab, @path, count{p: a:sceneIndex ref="@path"} as count}

表达式评估

搜索表达式评估基于 C# 迭代器模式和 yield 关键字的使用。这可确保评估作为完全异步作公开,并尽可能非阻塞。它允许每个搜索表达式在完全计算初始搜索项集之前开始计算。

默认情况下,所有搜索表达式计算都在工作线程中完成,以免阻塞编辑器。对于需要依赖非线程安全的 Unity API 的作(如某些选择器访问器),我们有一个实用程序 API 来将这些作排队在主线程上并维护生成搜索项的模式。

自定义搜索表达式语言

搜索表达式语言已设计为可自定义的。用于自定义框架所有部分的 API 将在将来的版本中提供。

其他资源

文本查询引用
其他搜索过滤器