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

AdvancedObjectSelectorAttribute

UnityEditor.SearchService 中的类

建议更改

成功!

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

关闭

提交失败

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

关闭

取消

描述

此属性允许您注册自定义高级对象选择器。

高级对象选择器是一个对象选择器,可以对其进行编程自定义以在特定对象字段上打开,而无需修改对象字段本身。它还允许完全控制 UI,因此您可以创建自己的搜索窗口(如果需要)。需要注册两种方法:对象选择器处理程序和验证器。处理程序打开对象选择器,验证器验证对象选择器是否可以针对当前选择上下文打开。以下是如何使用 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注册一个方法作为高级对象选择器。