版本:Unity 6 (6000.0)
语言英语
  • C#

SearchProvider

UnityEditor.Search 中的类


实现接口:ISerializationCallbackReceiver

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们确实会阅读用户建议的每处更改,并在有需求的情况下进行更新。

关闭

提交失败

由于某些原因,您建议的更改无法提交。请在几分钟后<a>重试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

说明

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用于获取并格式化搜索项标签的处理程序。
fetchPreviewfetchPreview 与 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当前搜索提供商,为创建新搜索项目提供的帮助函数。