Создание пользовательских индексаторов поиска
Для поиска ассетов по свойствам, не включенным в индекс по умолчанию, используйте пользовательские индексаторы. Вы можете активировать индивидуальные пользовательские индексаторы для каждого проекта.
Настраиваемые индексаторы, включенные в Редактор
Unity Editor по умолчанию включает несколько пользовательских индексаторов для поддержки общих сценариев расширенной индексации. Однако эти индексаторы могут быть не актуальны для всех пользователей. Если вы исключите их из индекса по умолчанию, это уменьшит время индексации и размер хранилища для пользователей, которым не нужны эти дополнительные свойства.
Создание пользовательского индексатора
Используйте Search.CustomObjectIndexerAttribute для создания собственного индексатора.
Настраиваемый индексатор
Примеры использования пользовательского индексатора:
- Создание свойств из других свойств. Например, вычисление и метка текстур, которые являются степенью двух.
- Внедрить собственную систему маркировки или маркировки.
- Поиск по скрытым свойствам, таким как теги шейдеров.
- Поиск свойств, которые не серийизованы, например файлы JSON.
Примеры и примечания к пользовательским индексаторам
В этом разделе представлены два примера пользовательских индексаторов и раздел с примечаниями к примерам.
Пример настраиваемого индексатора: индексация шейдеров
using UnityEngine;
using UnityEditor.Search;
public static class ShaderIndexing
{
const int version = 1;
public static string[] kTagIds = new string []
{
"LIGHTMODE",
"SHADOWCASTER",
"SHADOWCOLLECTOR",
"Vertex",
"VertexLM",
"VertexLMRGBM",
"REQUIREOPTIONS",
"FORCENOSHADOWCASTING",
"IGNOREPROJECTOR",
"SHADOWSUPPORT",
"PASSFLAGS",
"RenderType",
"DisableBatching",
"LodFading",
"RenderPipeline",
"Picking",
"SceneSelectionPass",
};
[CustomObjectIndexer(typeof(Shader), version = version)]
public static void IndexShaderTagProperties(CustomObjectIndexerTarget context, ObjectIndexer indexer)
{
if (!(context.target is Shader shader))
return;
foreach(var tagIdStr in kTagIds)
{
var tagId = new UnityEngine.Rendering.ShaderTagId(tagIdStr);
var tagValue = shader.FindSubshaderTagValue(0, tagId);
var tagPropertyName = $"sh_{tagIdStr.ToLower()}";
if (!string.IsNullOrEmpty(tagValue.name))
{
indexer.IndexProperty<string, Shader>(context.documentIndex, $"{nameof(Shader)}_tag.{tagPropertyName}", tagValue.name, saveKeyword:false, exact:false);
}
}
}
}
Пример пользовательского индексатора: текстуры 2D
using UnityEditor.Search;
using UnityEngine;
public static class TextureCustomIndexing
{
const int version = 1;
[CustomObjectIndexer(typeof(Texture2D))]
static void IndexMobileFriendlyTexture(CustomObjectIndexerTarget target, ObjectIndexer indexer)
{
var texture = target.target as Texture2D;
if (texture == null)
return;
bool isMobileFriendly = texture.width < 64 && texture.height < 64;
indexer.IndexProperty<bool, Texture2D>(target.documentIndex, "texture2d.testismobilefriendly", isMobileFriendly.ToString(), saveKeyword: false, exact: false);
}
}
Примечания к примерам
Эти примеры свидетельствуют о следующем:
CustomObjectIndexerс типом и версией.Функции индексирования передается
ObjectIndexer, которые можно использовать для добавления свойств или слов в индекс.Поскольку индексатор использует
IndexProperty, значение свойства индексируется для обеспечения частичного соответствия.- Для поиска свойства можно использовать следующий синтаксис:
-
propertyname=exactpropertyvalueПример:
shader_tag.rendertype=opaque -
propertyname:partialpropertyvalueПример:
shader_tag.rendertype:opaqилиshader_tag.rendertype:opaque
См. Операторы поисковых запросов для более подробной информации.
-
Чтобы восстановить индекс, измените версию
CustomObjectIndexer.Используйте
IndexProperty<PropertyType, PropertyTypeOwner>, чтобы убедиться, чтоtestismobilefriendlyдоступен в конструкторе запросов. Это относится только к примеру текстуры 2D.Чтобы иметь уникальное имя свойства, которое не имеет конфликтов в конструкторе запросов, префикс
propertynameс чем-то, например,PrefixForThisType.Используйте
saveKeyword: false, чтобы убедиться, что список ключевых слов индекса не загрязнен ключевым словомVALUES.Используйте
exact: false, чтобы разрешить поиск неточностей.
Активация и деактивация пользовательского индексатора
Чтобы активировать или отключить пользовательские индексаторы, см. Настройки поиска.