SearchProvider
Описание
SearchProvider управляет поиском определенных типов объектов и управляет всеми полями SearchItem, такими как миниатюры, описания, подфильтры.
Первый пример, который позволяет искать конкретные префабы и вставлять их в сцену.
using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEditor.Search; using UnityEngine; static class TreeSearchProvider { internal static string id = "example_tree"; [SearchItemProvider] internal static SearchProvider CreateProvider() { return new SearchProvider("example_tree", "Trees") { filterId = "tree:", priority = 99999, // Put example provider at a low priority showDetailsOptions = ShowDetailsOptions.Inspector | ShowDetailsOptions.Actions, fetchItems = (context, items, provider) => FetchItems(context, provider), fetchThumbnail = (item, context) => AssetDatabase.GetCachedIcon(item.id) as Texture2D, fetchPreview = (item, context, size, options) => AssetDatabase.GetCachedIcon(item.id) as Texture2D, fetchLabel = (item, context) => AssetDatabase.LoadMainAssetAtPath(item.id).name, fetchDescription = (item, context) => AssetDatabase.LoadMainAssetAtPath(item.id).name, toObject = (item, type) => AssetDatabase.LoadMainAssetAtPath(item.id), trackSelection = TrackSelection, startDrag = StartDrag }; } private static IEnumerable<SearchItem> FetchItems(SearchContext context, SearchProvider provider) { if (context.empty) yield break; // Yield items asynchronously which is the recommended way. foreach (var guid in AssetDatabase.FindAssets("t:Prefab tree " + context.searchQuery)) yield return provider.CreateItem(context, AssetDatabase.GUIDToAssetPath(guid), null, null, null, null); } private static void TrackSelection(SearchItem searchItem, SearchContext searchContext) { EditorGUIUtility.PingObject(AssetDatabase.LoadMainAssetAtPath(searchItem.id)); } private static void StartDrag(SearchItem item, SearchContext context) { if (context.selection.Count > 1) { var selectedObjects = context.selection.Select(i => AssetDatabase.LoadMainAssetAtPath(i.id)); var paths = context.selection.Select(i => i.id).ToArray(); StartDrag(selectedObjects.ToArray(), paths, item.GetLabel(context, true)); } else StartDrag(new[] { AssetDatabase.LoadMainAssetAtPath(item.id) }, new[] { item.id }, item.GetLabel(context, true)); } public static void StartDrag(UnityEngine.Object[] objects, string[] paths, string label = null) { if (paths == null || paths.Length == 0) return; DragAndDrop.PrepareStartDrag(); DragAndDrop.objectReferences = objects; DragAndDrop.paths = paths; DragAndDrop.StartDrag(label); } [SearchActionsProvider] internal static IEnumerable<SearchAction> ActionHandlers() { yield return new SearchAction(id, "Insert tree", null, "Insert a single tree in scene", (SearchItem item) => InsertPrefab(item.id)); } static GameObject InsertPrefab(string path) { return (GameObject)PrefabUtility.InstantiatePrefab( AssetDatabase.LoadMainAssetAtPath(path), Selection.activeGameObject != null ? Selection.activeGameObject.transform : null); } }
Еще один пример, который позволяет искать и изменять освещение. Этот поставщик использует другого поставщика для получения освещения.
using System.Collections.Generic; using UnityEditor; using UnityEditor.Search; using UnityEngine; static class LightsSearchProvider { [SearchItemProvider] internal static SearchProvider CreateProvider() { return new SearchProvider("example_lights", "Lights") { filterId = "z:", priority = 99999, // Put example provider at a low priority showDetailsOptions = ShowDetailsOptions.Inspector, fetchItems = (context, items, provider) => FetchItems(context, provider), toObject = (item, type) => item.data as Light, onEnable = () => { /*Cache some data in here*/ }, onDisable = () => { /*Clear the cache*/ }, // This provider can be used in the scene view contextually. isEnabledForContextualSearch = () => IsFocusedWindowTypeName("SceneView") }; } static IEnumerable<SearchItem> FetchItems(SearchContext context, SearchProvider provider) { if (context.empty) yield break; var sceneProvider = SearchService.GetProvider("scene"); using (var sceneQuery = SearchService.CreateContext(sceneProvider, $"t:light {context.searchQuery}")) using (var results = SearchService.Request(sceneQuery)) { var lightIcon = EditorGUIUtility.FindTexture("Lighting"); foreach (var r in results) { if (r == null) { // ***IMPORTANT***: Make sure to yield so you do not block the main thread waiting for results. yield return null; } else { yield return provider.CreateItem(context, r.id, r.GetLabel(sceneQuery, true), r.GetDescription(sceneQuery, true), lightIcon, r.ToObject<GameObject>().GetComponent<Light>()); } } } } static bool IsFocusedWindowTypeName(string focusWindowName) { return EditorWindow.focusedWindow != null && EditorWindow.focusedWindow.GetType().ToString().EndsWith("." + focusWindowName); } [MenuItem("Examples/SearchProvider/Show lights")] public static void ShowLights() { // Search for directional lights (lights with "directional" in their name) SearchService.ShowWindow(SearchService.CreateContext("z:directional")); } }
Свойства
| Свойство | Описание |
|---|---|
| actions | Действия поставщика поиска. |
| active | Показывает, активен ли поставщик поиска. Неактивных поставщиков служба поиска игнорирует. Активное состояние можно переключить в настройках поиска. |
| fetchColumns | Обработчик, используемый для перечисления столбцов поиска, используемых в представлении таблицы поиска. |
| fetchDescription | Обработчик для предоставления асинхронного описания элемента. Вызывается, когда элемент собирается быть отображенным. Позволяет поставщику плагинов получать длинное описание только тогда, когда оно необходимо. |
| fetchItems | MANDATORY: Обработчик для получения элементов для данного контекста поиска. Возвращаемым значением является объект, который может быть типа IEnumerable или IEnumerator. Перечисление этих объектов должно возвращать SearchItems. |
| fetchLabel | Обработчик, используемый для получения и форматирования метки элемента поиска. |
| fetchPreview | Похоже на fetchThumbnail, fetchPreview обычно возвращает более большой предварительный просмотр. Поиск UI будет постепенно показывать один предварительный просмотр в каждом кадре, предотвращая блокировку UI, если необходимо одновременно генерировать много предварительных просмотров. |
| fetchPropositions | Обработчик, используемый для перечисления предложений поиска, когда пользователь использует TAB для автоматического завершения запроса. |
| fetchThumbnail | Обработчик для предоставления асинхронного миниатюрного изображения элемента. Вызывается, когда элемент собирается быть показанным. По сравнению с предварительным просмотром миниатюра должна быть маленькой и возвращаться как можно быстрее. Используйте fetchPreview, если вы хотите создать предварительный просмотр, который больше и медленнее возвращается. Позволяет поставщику плагинов получать/создавать предварительные просмотры только тогда, когда они нужны. |
| filterId | Текстовый токен, используемый для "фильтрации" по поставщику поиска (например: "me:", "p:", "s:"). |
| id | Поиск поставщика уникальный ID. |
| isEnabledForContextualSearch | Вызывается при поиске в "контекстном режиме". Возвращает true, если поставщик поиска включен для данного контекста поиска. |
| isExplicitProvider | Этот поставщик поиска активен только в том случае, если он явно указан с помощью filterId. |
| name | Уникальный ID поставщика поиска. |
| onDisable | Вызывается при закрытии SearchWindow. Позволяет поставщику поиска высвободить кэшируемые ресурсы. |
| onEnable | Вызывается при открытии SearchWindow. Позволяет поисковому провайдеру выполнить некоторое кэширование. |
| priority | Подсказка для сортировки поставщика поиска. Влияет на порядок результатов поиска и порядок, в котором поставщики поиска отображаются в FilterWindow. |
| showDetails | Указывает, может ли поставщик поиска отображать дополнительные сведения или нет. |
| showDetailsOptions | Определяет параметры деталей, которые будут отображаться. |
| startDrag | Если реализовано, элемент поддерживает перетаскивание. Это зависит от SearchProvider правильно настроить менеджер DragAndDrop. |
| toObject | Возвращает любой допустимый объект Unity, содержащийся в элементе поиска. |
| trackSelection | Вызывается при изменении выбора и может быть отслежена. |
| type | Тип поставщика поиска может быть другим идентификатором поставщика поиска, на котором базируется поставщик. Это используется, когда у нас есть несколько групп в представлении поиска, которые перечисляют результаты от аналогичного поставщика. |
Конструкторы
| Конструктор | Описание |
|---|---|
| SearchProvider | Создайте новый SearchProvider. |
Открытые методы
| Метод | Описание |
|---|---|
| CreateItem | Помощная функция для создания нового элемента поиска для текущего поставщика поиска. |