Unity 6.3
0 онлайн 36 гостей 3 в системе
Вход

Поисковые выражения

Выражения поиска позволяют добавить в язык запросов поиска выражения сложных запросов, которые перекликаются с несколькими поставщиками, например, для поиска всех объектов в сцене, использующих некомпилируемый шейдер.

Поисковые выражения могут быть соединены для преобразования или выполнения набора манипуляций с Элементами Поиска.

Как использовать поисковые выражения

Введите выражение поиска в окно Поиск для возврата результата:

Results for the search expression 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, 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 самых маленьких текстур в проекте

  1. t:texture: находит все текстуры в проекте и выбирает свойство size.
  2. sort{ t:texture, @size}: сортирует все текстуры по их свойству размера.
  3. first{10: выбирает первые 10 отсортированных текстур.
  4. 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} в окно Поиск, может быть трудно прочитать, какое количество соответствует какому типу:

Два результата, оба называются Count
Два результата, оба называются Count

Использование псевдонима: sort{count{t:audio as Audio, t:texture as Texture}, desc} дает более читаемый результат:

Один результат называется Текстура, а другой называется Аудио
Один результат называется Текстура, а другой называется Аудио

Для динамического создания имен псевдонимов используйте функцию 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}

  • Найти сетку с наибольшим количеством вершин (при условии, что селектор @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 для настройки всех частей фреймворка будет доступен в будущем выпуске.

Дополнительные ресурсы