Unity 6.3
0 онлайн 58 гостей 3 в системе
Вход

SearchUtils

класс в UnityEditor.Search

Описание

Обеспечивает различные полезные функции, которые используются 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Форматирует число в строку сокращенного числа.
FrameAssetFromPathPing ассета в браузере проекта.
GetAssetPathВозвращает путь ассета элемента поиска, если таковой имеется.
GetAssetPreviewFromPathВозвращает текстуру предварительного просмотра для использования в представлении поиска.
GetAssetThumbnailFromPathВозвращает текстуру миниатюры для использования в представлении поиска.
GetHierarchyAssetPathПолучить путь к сцене (или префаб), содержащей GameObject.
GetHierarchyPathПолучить иерархический путь GameObject, включая имя сцены, если includeScene установлено на true.
GetMainAssetInstanceIDВозвращает экземпляр ассета ID.
GetMainWindowCenteredPositionВозвращает UnityEngine.Rect для центрирования окна на главном окне Unity Editor.
GetObjectPathПолучить путь к объекту Unity. Если это GameObject или Компонент, то это. В противном случае это имя ассета.
GetSceneObjectPreviewВозвращает предварительный просмотр объекта сцены для использования в представлении поиска.
GetTransformPathФорматировать красивое имя компонента Transform путем добавления всех имен родительской иерархии.
GetTypeIconВозвращает миниатюру для заданного типа, которая может быть отображена в представлении поиска. См. SearchProvider.fetchThumbnail.
MatchSearchGroupsПомощная функция для сопоставления строки с SearchContext. Эта функция попытается сопоставить поисковый запрос с каждым токеном контента (подобно рабочему процессу меню AddComponent).
OpenQueryОткрыть вид поиска для данного запроса.
PingAssetPing объекта.
SelectMultipleItemsВыберите и выполните ping нескольких объектов в браузере Project.
ShowColumnSelectorОткрывает окно выбора вспомогательного столбца, позволяющее пользователю искать столбец для добавления.
ShowIconPickerОткрывает инструмент выбора поиска для выбора значка.
SplitCamelCaseТокенизировать строку каждую заглавную букву.
SplitEntryComponentsРазделяет запись в соответствии с указанным списком разделителей.
SplitFileEntryComponentsРазделяет запись файла в соответствии с списком разделителей и находит все вариации на имя записи.
StartDragФункция утилиты, используемая для инициирования операции перетаскивания из представления поиска.
TryParseПопробуйте перевести выражение в число.