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

SearchUtils

UnityEditor.Search 中的类

建议更改

成功!

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

关闭

提交失败

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

关闭

取消

描述

提供由SearchProvider使用的各种实用程序函数。

using System;
using System.Collections;
using System.Globalization;
using System.Linq;
using UnityEditor.Search;
using UnityEditor;
using UnityEngine;

/// <summary>
/// Custom provider showing how to implement a custom Query Engine supporting a Spatial search filter.
/// </summary>
public static class SpatialProvider
{
    internal static string type = "spl";
    internal static string displayName = "Spatial";

    static GameObject[] s_GameObjects;
    static QueryEngine<GameObject> s_QueryEngine;

    [SearchItemProvider]
    internal static SearchProvider CreateProvider()
    {
        return new SearchProvider(type, displayName)
        {
            active = false,
            filterId = "spl:",
            onEnable = OnEnable,
            fetchItems = (context, items, provider) => SearchItems(context, provider),
            fetchLabel = FetchLabel,
            fetchDescription = FetchDescription,
            fetchThumbnail = FetchThumbnail,
            fetchPreview = FetchPreview,
            trackSelection = TrackSelection,
            isExplicitProvider = false,
        };
    }

    static void OnEnable()
    {
        s_GameObjects = SearchUtils.FetchGameObjects().ToArray();
        s_QueryEngine = new QueryEngine<GameObject>();

        // Id supports all operators
        s_QueryEngine.AddFilter("id", go => go.GetInstanceID());
        // Name supports only :, = and !=
        s_QueryEngine.AddFilter("n", go => go.name, new[] {":", "=", "!="});

        // Add distance filtering. Does not support :.
        s_QueryEngine.AddFilter("dist", DistanceHandler, DistanceParamHandler, new[] {"=", "!=", "<", ">", "<=", ">="});
    }


    static IEnumerator SearchItems(SearchContext context, SearchProvider provider)
    {
        var query = s_QueryEngine.ParseQuery(context.searchQuery);
        if (!query.valid)
            yield break;

        var filteredObjects = query.Apply(s_GameObjects);
        foreach (var filteredObject in filteredObjects)
        {
            yield return provider.CreateItem(filteredObject.GetInstanceID().ToString(), null, null, null, filteredObject.GetInstanceID());
        }
    }


    static string FetchLabel(SearchItem item, SearchContext context)
    {
        if (item.label != null)
            return item.label;

        var go = ObjectFromItem(item);
        if (!go)
            return item.id;

        var transformPath = SearchUtils.GetTransformPath(go.transform);
        var components = go.GetComponents<Component>();
        if (components.Length > 2 && components[1] && components[components.Length - 1])
            item.label = $"{transformPath} ({components[1].GetType().Name}..{components[components.Length - 1].GetType().Name})";
        else if (components.Length > 1 && components[1])
            item.label = $"{transformPath} ({components[1].GetType().Name})";
        else
            item.label = $"{transformPath} ({item.id})";

        return item.label;
    }


    static string FetchDescription(SearchItem item, SearchContext context)
    {
        var go = ObjectFromItem(item);
        return (item.description = SearchUtils.GetHierarchyPath(go));
    }


    static Texture2D FetchThumbnail(SearchItem item, SearchContext context)
    {
        var obj = ObjectFromItem(item);
        if (obj == null)
            return null;

        return item.thumbnail = GetThumbnailForGameObject(obj);
    }

    static Texture2D FetchPreview(SearchItem item, SearchContext context, Vector2 size, FetchPreviewOptions options)
    {
        var obj = ObjectFromItem(item);
        if (obj == null)
            return item.thumbnail;

        var assetPath = SearchUtils.GetHierarchyAssetPath(obj, true);
        if (string.IsNullOrEmpty(assetPath))
            return item.thumbnail;

        if (options.HasFlag(FetchPreviewOptions.Large))
        {
            if (AssetPreview.GetAssetPreview(obj) is Texture2D tex)
                return tex;
        }
        return GetAssetPreviewFromPath(assetPath, size, options);
    }


    static void TrackSelection(SearchItem item, SearchContext context)
    {
        var obj = ObjectFromItem(item);
        if (obj)
            Selection.activeGameObject = obj;
        if (SceneView.lastActiveSceneView != null)
            SceneView.lastActiveSceneView.FrameSelected();
    }

    static float DistanceHandler(GameObject go, Vector3 p)
    {
        return (go.transform.position - p).magnitude;
    }

    static Vector3 DistanceParamHandler(string param)
    {
        if (param == "selection")
        {
            var centerPoint = Selection.gameObjects.Select(go => go.transform.position).Aggregate((v1, v2) => v1 + v2);
            centerPoint /= Selection.gameObjects.Length;
            return centerPoint;
        }

        if (param.StartsWith("[") && param.EndsWith("]"))
        {
            param = param.Trim('[', ']');
            var vectorTokens = param.Split(',');
            var vectorValues = vectorTokens.Select(token => float.Parse(token, CultureInfo.InvariantCulture.NumberFormat)).ToList();
            while (vectorValues.Count < 3)
                vectorValues.Add(0f);
            return new Vector3(vectorValues[0], vectorValues[1], vectorValues[2]);
        }

        var obj = s_GameObjects.FirstOrDefault(go => go.name == param);
        if (!obj)
            return Vector3.zero;
        return obj.transform.position;
    }

    static GameObject ObjectFromItem(SearchItem item)
    {
        var instanceID = Convert.ToInt32(item.id);
        var obj = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
        return obj;
    }

    static Texture2D GetThumbnailForGameObject(GameObject go)
    {
        var thumbnail = PrefabUtility.GetIconForGameObject(go);
        if (thumbnail)
            return thumbnail;
        return EditorGUIUtility.ObjectContent(go, go.GetType()).image as Texture2D;
    }

    static Texture2D GetAssetPreviewFromPath(string path, Vector2 previewSize, FetchPreviewOptions previewOptions)
    {
        var obj = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(path);
        if (obj == null)
            return null;
        var preview = AssetPreview.GetAssetPreview(obj);
        if (preview == null || previewOptions.HasFlag(FetchPreviewOptions.Large))
        {
            var largePreview = AssetPreview.GetMiniThumbnail(obj);
            if (preview == null || (largePreview != null && largePreview.width > preview.width))
                preview = largePreview;
        }
        return preview;
    }
}

静态属性

entrySeparators用于将条目拆分为可索引标记的分隔符。

静态方法

CreateGroupProvider搜索提供程序的副本,用于创建新的组副本。
CreateQuery创建一个新的搜索查询。
CreateSceneResult创建一个与场景提供程序兼容的搜索项。
EnumerateAllQueries枚举所有用户和项目的搜索查询。
FetchGameObjects用于获取特定场景中所有游戏对象的实用程序函数。
FindQuery根据其 GUID 查找给定的搜索查询。
FindShiftLeftVariations提取单词的所有变体。例如:单词 hello 将具有以下变体:h、he、hel、hell、hello。
FormatBytes将数字格式化为以字节为单位的文件大小字符串。
FormatCount将数字格式化为缩短的数字字符串。
FrameAssetFromPath在项目浏览器中 Ping 资源。
GetAssetPath如果存在,则返回搜索项的资源路径。
GetAssetPreviewFromPath返回要在搜索视图中使用的预览纹理。
GetAssetThumbnailFromPath返回要在搜索视图中使用的缩略图纹理。
GetHierarchyAssetPath获取包含 GameObjects 的场景(或预制件)的路径。
GetHierarchyPath获取 GameObject 的层次结构路径,如果 includeScene 设置为 true,则包括场景名称。
GetMainAssetInstanceID返回资源实例 ID。
GetMainWindowCenteredPosition返回一个 UnityEngine.Rect,用于将窗口居中在主 Unity 编辑器窗口上。
GetObjectPath获取 Unity 对象的路径。如果它是 GameObject 或 Component,则为 . 否则为资源名称。
GetSceneObjectPreview返回要在搜索视图中使用的场景对象预览。
GetTransformPath通过追加所有父级层次结构名称来格式化 Transform 组件的漂亮名称。
GetTypeIcon返回给定类型的缩略图,可以在搜索视图中显示。请参阅 SearchProvider.fetchThumbnail。
MatchSearchGroups辅助函数,用于将字符串与 SearchContext 匹配。这将尝试将搜索查询与内容的每个标记匹配(类似于 AddComponent 菜单工作流程)。
OpenQuery为给定查询打开搜索视图。
PingAssetPing 对象。
SelectMultipleItems在项目浏览器中选择和 Ping 多个对象。
ShowColumnSelector打开辅助列选择器窗口,允许用户搜索要添加的列。
ShowIconPicker打开搜索选择器以选择图标。
SplitCamelCase将字符串标记化为每个大写字母。
SplitEntryComponents根据指定的分隔符列表拆分条目。
SplitFileEntryComponents根据分隔符列表拆分文件条目,并查找条目名称的所有变体。
StartDrag用于从搜索视图启动拖动操作的实用程序函数。
TryParse尝试将表达式解析为数字。