此属性允许您注册自定义高级对象选择器。
高级对象选择器是一个对象选择器,可以对其进行编程自定义以在特定对象字段上打开,而无需修改对象字段本身。它还允许完全控制 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 | 注册一个方法作为高级对象选择器。 |