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 | 强制性:用于获取给定搜索上下文中的项的处理程序。返回值可以是 IEnumerable 或 IEnumerator 类型的对象。这些对象的枚举应返回 SearchItem。 |
fetchLabel | 用于获取并格式化搜索项标签的处理程序。 |
fetchPreview | fetchPreview 与 fetchThumbnail 类似,通常会返回一个更大的预览。搜索 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 | 搜索提供商类型可以是该提供商基于的另一个搜索提供商 id。在搜索视图中有对来自类似提供商的结果进行列出的多个组时,会使用此方法。 |
SearchProvider | 创建新的 SearchProvider。 |
CreateItem | 当前搜索提供商,为创建新搜索项目提供的帮助函数。 |