Version: 2021.1
public Action onDisable ;

描述

Called when the SearchWindow is closed. Allows the search provider to release cached resources.

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;

static class SearchProviderLights
{
    static SearchProvider sceneProvider = null;
    static Texture2D lightTexture = EditorGUIUtility.FindTexture("Lighting");

    [SearchItemProvider]
    internal static SearchProvider CreateProvider()
    {
        return new SearchProvider("example_lights", "example_Lights")
        {
            active = false,
            filterId = "z:",
            priority = 99999, // put example provider at a low priority
            fetchItems = (context, items, provider) => FetchItems(context, provider),
            showDetailsOptions = ShowDetailsOptions.Inspector,
            toObject = ToObject,
            onEnable = OnEnable,
            onDisable = OnDisable,
            // This provider can be used in the scene and hierarchy contextual search
            isEnabledForContextualSearch = () =>
                IsFocusedWindowTypeName("SceneView") ||
                IsFocusedWindowTypeName("SceneHierarchyWindow")
        };
    }

    private static IEnumerable<SearchItem> FetchItems(SearchContext context, SearchProvider provider)
    {
        if (string.IsNullOrEmpty(context.searchQuery) || sceneProvider == null)
            yield break;

        using (var innerContext = SearchService.CreateContext(sceneProvider, "t:light " + context.searchQuery))
        using (var results = SearchService.Request(innerContext))
        {
            foreach (var r in results)
            {
                if (r != null)
                {
                    yield return provider.CreateItem(context, r.id,
                        r.GetLabel(innerContext, true), r.GetDescription(innerContext, true),
                        lightTexture, null);
                }
                else
                {
                    // ***IMPORTANT***: Make sure to yield so you do not block the main thread waiting for results.
                    yield return null;
                }
            }
        }
    }

    private static void OnEnable()
    {
        sceneProvider = SearchService.GetProvider("scene");
    }

    private static void OnDisable()
    {
        sceneProvider = null;
    }

    private static UnityEngine.Object ToObject(SearchItem item, Type type)
    {
        if (!(EditorUtility.InstanceIDToObject(int.Parse(item.id)) is GameObject light))
            return null;

        return light.GetComponent<Light>();
    }

    private 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"));
    }
}