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

AdvancedObjectSelectorAttribute

класс в UnityEditor.SearchService

Описание

Этот атрибут позволяет зарегистрировать пользовательский расширенный селектор объектов.

Расширенный селектор объектов — это селектор объектов, который может быть настроен программно для открытия на определенных полях объектов, без изменения самих полей объектов. Он также позволяет полный элемент управления над UI, так что вы можете создать собственное окно поиска, если хотите. Есть два метода, которые должны быть зарегистрированы: обработчик селекторов объектов и проверяющий. Обработчик открывает селектор объектов, а проверяющий проверяет, что селектор объектов может быть открыт для текущего выбора context. Вот пример использования Search для открытия пользовательского селектора объектов только для материалов:

using System;
using System.Linq;
using UnityEditor.Search;
using UnityEditor.SearchService;
using UnityEngine;

static class MaterialSelector
{
    const string MaterialSelectorId = "material_selector";
    static ISearchView s_SearchView;

    [AdvancedObjectSelectorValidator(MaterialSelectorId)]
    static bool HandleAdvancedObjectSelectorValidation(ObjectSelectorSearchContext context)
    {
        // This selector only works for assets.
        if ((context.visibleObjects & VisibleObjects.Assets) == 0)
            return false;

        // This selector only supports materials and their derived types.
        if (!OnlyMaterialTypes(context))
            return false;

        return true;
    }

    [AdvancedObjectSelector(MaterialSelectorId, "Material Selector", 10)]
    static void HandleAdvancedObjectSelector(AdvancedObjectSelectorEventType eventType, in AdvancedObjectSelectorParameters parameters)
    {
        switch (eventType)
        {
            case AdvancedObjectSelectorEventType.BeginSession:
                BeginSession(parameters);
                break;
            case AdvancedObjectSelectorEventType.EndSession:
                EndSession(parameters);
                break;
            case AdvancedObjectSelectorEventType.SetSearchFilter:
                SetSearchFilter(parameters);
                break;
            case AdvancedObjectSelectorEventType.OpenAndSearch:
                OpenSelector(parameters);
                break;
        };
    }

    static void BeginSession(in AdvancedObjectSelectorParameters parameters)
    {
        // Here you can cache some data if needed.
    }

    static void EndSession(in AdvancedObjectSelectorParameters parameters)
    {
        // Here you can clear the cached data if needed.
        // EndSession can be called in two ways:
        // 1. Naturally when the selectorClosedHandler is called upon closing the window (which you should do in your window if you don't use Search).
        // 2. Forcefully when a new session is started before the current one is finished.
        // In the second case, we need to close the window to avoid any issues since the ObjectSelector API does not support concurrent selectors.
        if ((parameters.context.endSessionModes & ObjectSelectorSearchEndSessionModes.CloseSelector) != 0)
        {
            s_SearchView?.Close();
        }

        s_SearchView = null;
    }

    static void SetSearchFilter(in AdvancedObjectSelectorParameters parameters)
    {
        // Here you can handle the request to set a new search filter.
        s_SearchView?.SetSearchText(parameters.searchFilter);
    }

    static void OpenSelector(in AdvancedObjectSelectorParameters parameters)
    {
        var selectContext = parameters.context;
        var selectorCloseHandler = parameters.selectorClosedHandler;
        var trackingHandler = parameters.trackingHandler;

        // This selector handles any kind of materials, but if a specific material type is passed
        // in the context, then only this type of material will be shown.
        var searchText = string.Join(" or ", selectContext.requiredTypeNames.Select(typeName => $"t={typeName}"));
        var searchContext = SearchService.CreateContext("asset", searchText);
        var viewState = SearchViewState.CreatePickerState("Material",
            searchContext,
            selectHandler: (item, canceled) => selectorCloseHandler(item?.ToObject(), canceled),
            trackingHandler: (item) => trackingHandler(item?.ToObject()), null);
        viewState.windowTitle = new GUIContent("Material Selector");
        viewState.position = SearchUtils.GetMainWindowCenteredPosition(new Vector2(600, 400));
        s_SearchView = SearchService.ShowPicker(viewState);
    }

    static bool OnlyMaterialTypes(ObjectSelectorSearchContext context)
    {
        var requiredTypes = context.requiredTypes.Zip(context.requiredTypeNames, (type, name) => new Tuple<Type, string>(type, name));
        return requiredTypes.All(typeAndName =>
        {
            return typeAndName.Item1 != null && typeof(Material).IsAssignableFrom(typeAndName.Item1) ||
                typeAndName.Item2.Contains("material", StringComparison.OrdinalIgnoreCase);
        });
    }
}

Сигнатура метода, зарегистрированного с атрибутом AdvancedObjectSelectorAttribute, должна быть следующей:

static void HandleAdvancedObjectSelector(AdvancedObjectSelectorEventType eventType, in AdvancedObjectSelectorParameters parameters)

Сигнатура метода, зарегистрированного с атрибутом AdvancedObjectSelectorValidatorAttribute, должна быть следующей:

static bool HandleAdvancedObjectSelectorValidation(ObjectSelectorSearchContext context)

Примечание: Эти пользовательские расширенные селекторы объектов активны только тогда, когда Мотор Селектора Объектов установлен на "Расширенный" (см. Настройки/Поиск страница настроек).

Конструкторы

Конструктор Описание
AdvancedObjectSelectorAttributeРегистрирует метод для действия в качестве расширенного селектора объектов.