Called when the SearchWindow is opened. Allows the search provider to perform some caching.
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") { 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")); } }