Поисковые выражения
Выражения поиска позволяют добавить в язык запросов поиска выражения сложных запросов, которые перекликаются с несколькими поставщиками, например, для поиска всех объектов в сцене, использующих некомпилируемый шейдер.
Поисковые выражения могут быть соединены для преобразования или выполнения набора манипуляций с Элементами Поиска.
Как использовать поисковые выражения
Введите выражение поиска в окно Поиск для возврата результата:
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,materialилиtexture. Используя обычный запрос, это можно выразить следующим образом:t:shader or t:material or t:texture
Функции
Unity содержит библиотеку функций поисковых выражений для манипулирования и преобразования наборов элементов поиска. Каждая из этих функций может принимать несколько аргументов и возвращать набор элементов. Unity Выражения поиска используют квадратные скобки для обозначения вызовов функций.
Полный список всех функций здесь.
Пример: Функция Количество подсчитывает элементы каждого набора, переданного в качестве параметра, и возвращает число.
count{t:shader}: возвращает набор, содержащий количество шейдеров в проекте. Пример:{34}.count{t:shader, t:texture}: возвращает набор, содержащий количество шейдеров и текстур в проекте. Пример:{34, 2048}.
Функции могут быть цеплены вместе, подобно s-выражениям, используемым в LISP языках программирования.
Примечание: Может быть только одно корневое выражение.
Пример цепи оцениваемых функций в порядке их выполнения:
print{"path=@path", first{10, sort{t:texture, @size}}}: печать путь 10 самых маленьких текстур в проекте
t:texture: находит все текстуры в проекте и выбирает свойство size.sort{ t:texture, @size}: сортирует все текстуры по их свойству размера.first{10: выбирает первые 10 отсортированных текстур.print{ "path=@path": печатает этот список в консоли в соответствии со строкой формата, где Unity Search извлекает свойство пути каждого полученного элементаpath=@path.
Функции могут иметь несколько подписей (имя метода и тип и вид (значение, ссылка или выход) каждого из его формальных параметров, подобно C#) и могут поддерживать необязательные (параметры, которые не нужно передавать функции) и вариативные (параметры, которые могут принимать переменное количество аргументов) параметры.
Литералы в поисковых выражениях
Литералы — это фактические слова или числа, по которым вы хотите искать, или числовые значения, которые вы хотите получить, в отличие от строки запроса. Например, t:texture ищет Assets с текстурой в имени типа (e.g.,Texture2D), но добавление кавычек делает его буквальным, «t:texture» ищет Asset с именем 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} -> {<run a query for t:shader>, <run a query for hello>, <run a query for 3>}
Струна
Строчные литералы могут быть использованы в качестве параметров для некоторых функций (например, format). Вы можете указать строчный литерал, используя одиночные или двойные кавычки:
«привет» или «привет»
Функция форматирования, принимающая в качестве параметра строку форматирования:
format{t:texture, '@path (@size)'}
Селекторы свойств и значения элементов поиска
Селектор — это идентификатор, обозначаемый префиксом @. Используйте селектор для доступа к свойству элемента для вычисления, фильтрации или форматирования. Селекторы могут сопоставляться с сериализированными свойствами UnityEngine.Object или с пользовательской функцией для доступа к динамическим данным.
Базовые селекторы, которые поддерживает любой элемент поиска, являются:
id: уникальный ID этого элемента в соответствии с его поставщиком поиска.-
value: внутреннее значение элемента. По умолчанию это его идентификатор, но функции могут переопределять значение элемента. 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={list of 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 Audio, t:texture as Texture}, desc} дает более читаемый результат:
Для динамического создания имен псевдонимов используйте функцию alias. Например:
alias{[1, 2, 3], 'Title value'}
возвратит элементы с этими метками:
{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} -
Найти сетку с наибольшим количеством вершин (при условии, что селектор @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# итератора и использует ключевое слово доходность. Это гарантирует, что оценка выполняется как полностью асинхронная операция и не блокирует, насколько это возможно. Это позволяет каждому выражению поиска начать вычисление до того, как начальные наборы элементов поиска будут полностью вычислены.
По умолчанию все оценки выражения поиска выполняются в рабочем потоке, чтобы не блокировать Редактор. Для операций, которые должны полагаться на непоточный безопасный поток Unity API (как некоторые аксессоры селекторов), у нас есть утилита API для очереди этих операций на основном потоке и поддержания шаблона , дающего элементы поиска.
Настройка языка выражения поиска
Язык поисковых выражений был разработан для настройки. APIs для настройки всех частей фреймворка будет доступен в будущем выпуске.