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

SearchProvider

класс в UnityEditor.Search


Интерфейсы приспособлений:ISerializationCallbackReceiver

Описание

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Обработчик для предоставления асинхронного описания элемента. Вызывается, когда элемент собирается быть отображенным. Позволяет поставщику плагинов получать длинное описание только тогда, когда оно необходимо.
fetchItemsMANDATORY: Обработчик для получения элементов для данного контекста поиска. Возвращаемым значением является объект, который может быть типа 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Помощная функция для создания нового элемента поиска для текущего поставщика поиска.