搜索表达式允许你在搜索查询语言中新增内容,以表示复杂的查询,这些查询将对多个提供程序进行交叉引用,例如,在 场景场景包含游戏环境和菜单。请将每个独特的场景文件视为一个独特的级别。在每个场景中,你应该放置环境、障碍物和装饰,实质上就是分阶段地设计和构建游戏。更多信息
参见 词汇表 中使用尚未编译的 着色器在 GPU 中运行的程序。更多信息
参见 词汇表 查找所有对象。
可以将搜索表达式连接起来,对搜索项目进行转换或执行集合操作。
在搜索窗口中输入搜索表达式,返回结果
搜索表达式以可以包含内部表达式的根表达式开头。
如下面的示例所示,简单的查询t:shader
是一个表达式。它会返回项目中所有着色器的搜索项目。
使用搜索表达式语言将多个查询组合成一个表达式,以创建更灵活的搜索。
搜索表达式支持以下内容
t:shader
t:prefab ref={t:texture}
count{t:shader}
3
或"this is a string literal"
@path
或@mesh
(任何以@
开头的标识符都被认为是选择器,可从搜索项目中提取值。选择器可以查找对象的属性,或用于动态计算结果)所有搜索表达式都返回一组搜索项目(IEnumerable<SearchItem>
)。作为一个一般准则,搜索表达式语言使用大括号{}
表示一组项目。即使诸如3
之类的文本表达式,在内部也作为一个集合进行评估:{3}
。
可以将搜索表达式连接起来,构成更复杂的查询
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=<其中一种 4K 纹理>
(例如,t:prefab ref=armor.png
然后是 t:prefab ref=treasure.png
)。
聚合所有结果并将此作为一个搜索项列表返回。
t:[shader, material, texture]
:查找所有类型为 shader
、material
或 texture
的对象。使用正常查询可以表示为
t:shader 或 t:material 或 t:texture
Unity 提供了一个搜索表达式函数库,用于处理和转换搜索项集合。这些函数中的每一个都可以采用多个参数,并返回一组项。Unity 搜索表达式使用花括号来表示函数调用。
所有函数的完整列表请 在此处 查看。
示例:函数 count 统计作为参数传递的每个集合中的项,并返回一个数字。
count{t:shader}
:返回一个集合,其中包含项目中着色器的数量。示例:{34}
。count{t:shader, t:texture}
:返回一个集合,其中包含项目中着色器和纹理的数量。示例:{34, 2048}
。函数可以链接在一起,类似于 LISP 编程语言中使用的 S 表达式。
注意:只能有一个根表达式。
按照操作顺序评估的函数链示例
print{"path=@path", first{10, sort{t:texture, @size}}}
:打印项目中 10 个最大纹理的路径
t:texture
:查找项目中的所有纹理,然后选择大小属性。sort{ t:texture, @size}
:根据其大小属性对所有这些纹理进行排序。first{10
:选择前 10 个经过排序的纹理。print{ "path=@path"
:根据一个格式字符串打印此列表到控制台中,其中 Unity Search 提取每个结果项 path=@path
的 path 属性。函数可有多个签名(方法的名称及其每个正式参数的类型和类型(值、引用或输出),类似于 C#),且支持可选(不需要传递给函数的参数)和可变参数(可以采用可变的数字参数)参数。
与查询字符串相反,字面值是您想要搜索或您想要检索的数字的实际单词或数字。例如,t:texture 搜索类型名称中带有 texture 的资源(例如Texture2D),但是,添加引号使其成为字面值后,“t:texture” 将搜索名为 t:texture 的资源。
表达式 | 描述 |
---|---|
数字 | 字面值 (1,2,3,依此类推 ) |
集合 | 方括号 ([ ] ) |
字符串 | 单引号或双引号 ('' 或 "" ) |
数字字面值可用作函数参数(例如 first
)。
first{10, t:shader}
-> {'t:shader' 查询所返回的前 10 个着色器}
使用方括号 []
表达一系列值。一个集合可以包含任何类型的表达式,但搜索表达式解析器会假定集合的元素是字面值,而不是搜索查询。
示例
[t:shader, hello, 3]
-> ["t:shader", "hello", 3]
如果使用大括号({}
),解析器会将此视为三个查询
{t:shader, hello, 3}
-> {<运行 t:shader 查询>, <运行 hello 查询>, <运行 3 查询>}
字符串字面值可用作一些函数(例如 format
)的参数。您可以使用单引号或双引号指定字符串字面值
“hello” 或 ‘hello’
格式函数将格式字符串作为参数
format{t:texture, '@path (@size)'}
选择器是使用 @
前缀表示的标识符。使用选择器访问项的属性以进行计算、过滤或格式化。选择器可以映射到 UnityEngine.Object 的序列化属性或映射到自定义函数以允许访问动态数据。
任何搜索项都支持的基本选择器包括
id
:根据其搜索提供程序,该项的唯一 ID。value
:项的内部值。默认情况下,它是其 ID,但函数可以覆盖项的值。label
:搜索窗口显示的项标签desc
或 description
:项描述(搜索窗口的第二行)Unity 还定义了搜索项的一般选择器,例如
@name
:UnityEngine.Object.name@size
:资源在磁盘上的文件大小@path
:资源路径@extension
:资源文件扩展名@provider
:给出此项目的搜索提供程序要访问搜索项目中的特定属性以执行操作,请使用选择器
count{t={distinct{select{a:assets, @type}}}}
a:assets, @type
找到项目中所有资源,并为这些对象选择type
属性。distinct
返回存在的所有类型列表。t={types 列表}
返回每种类型的每个资源的多个列表。count
计数项目中每种类型的资源有多少个。avg{@size,t:shader}
t:shader, @size
:找到所有着色器,然后选择 size 属性。avg
:计算项目中所有着色器的平均大小。print{@value, count{t:texture, t:material}}
@#
选择器查找序列化属性和材质属性
sort{t:texture, @#height}
:根据纹理序列属性的高度对所有纹理按顺序排序。您可以为搜索表达式命名以使其更易于在搜索窗口中显示。
例如,在搜索窗口中输入表达式 sort{count{t:audio, t:texture}, @value,desc}
时,可能难以知道哪个计数对应哪种类型
使用别名:sort{count{t:audio as 音频, t:texture as 纹理}, desc}
将产生更易于阅读的结果
要动态生成别名,请使用alias
函数。例如
alias{[1, 2, 3], '标题值'}
将生成带有这些标签的项目
{标题 1、标题 2、标题 3}
展开运算符 ...
允许将一组项目分组到多组项目中,而不是只有一组。
...{可扩展表达式}
-> {子表达式 1} {子表达式 2} {子表达式 N}
示例
一个小项目有3 个预制件、4 个纹理和 5 个着色器。以下表达式为所有资源提供计数
count{t:[prefab, texture, shader]}
-> {12}
搜索表达式t:[prefab, texture, shader]
的结果是一个统一的列表,包含 12 个预制件、纹理和着色器的项目。也可以表示为:t:prefab 或 t:texture 或 t:shader
。
使用展开运算符分别计算每种类型的资源数量
count{...t:[prefab, texture, shader]}
-> count{t:prefab, t:texture, t:shader}
-> {3, 4, 5}
groupBy
功能可用于扩展运算符,返回按通用键分组的一组项目。
示例
一个项目有三种类型的资产(预制件、纹理和着色器)。对于返回搜索项类型的选择器 @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}
找到顶点最多的网格Unity 的主图形图元。网格组成了你的 3D 世界的很大一部分。Unity 支持三角形或四边形多边形网格。Nurbs、Nurms、细分曲面必须转换为多边形。 更多信息
在 术语表 中查看(假设项目中提供了 @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。