此特性允许您注册自定义高级对象选择器验证器。
高级对象选择器是一种可以以编程方式自定义的对象选择器,可以在特定对象字段上打开,而无需修改对象字段本身。它还允许完全控制 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)
注意:这些自定义高级对象选择器仅在对象选择器引擎设置为“高级”时有效(请参阅 首选项/搜索 设置页面)。
AdvancedObjectSelectorValidatorAttribute | 注册一个方法作为高级对象选择器验证器。 |