Провайдеры поиска используют функцию fetchItems для поиска элементов и фильтрации результатов. Функция fetchItems имеет следующую подпись:
// context: the necessary search context (for example, tokenized search and
// sub-filters).
// items: list of items to populate (if not using the asynchronous api)
// provider: the Search Provider itself
public delegate IEnumerable<SearchItem> GetItemsHandler(SearchContext context,
List<SearchItem> items,
SearchProvider provider);
The SearchProvider must add new SearchItems to the items list or return an IEnumerable.
Примечание. Если вы не используете асинхронный API
fetchItems, вы должны вернутьnullв вашей функцииfetchItems.
SearchItem – это простая структура:
public struct SearchItem
{
public readonly string id;
// The item score affects how Search sorts the item within the results from the Search Provider.
public int score;
// Optional: Display name of the item. If the item does not have one,
// SearchProvider.fetchLabel is called).
public string label;
// If the item does not have a description SearchProvider.fetchDescription
// is called when Search first displays the item.
public string description;
// If true, the description already has rich text formatting.
public SearchItemDescriptionFormat descriptionFormat;
// If the item does not have a thumbnail, SearchProvider.fetchThumbnail
// is called when Search first displays the item.
public Texture2D thumbnail;
// Search Provider user-customizable content
public object data;
}
Для SearchItem требуется только id.
Совет. При фильтрации по
SearchContext.searchTextиспользуйте статическую функциюSearchProvider.MatchSearchGroup, которая выполняет частичный поиск.
Использование нечеткого поиска
Чтобы использовать нечеткий поиск для элемента, вы можете использовать FuzzySearch.FuzzyMatch, как в следующем примере:
if (FuzzySearch.FuzzyMatch(sq, CleanString(item.label), ref score, matches))
item.label = RichTextFormatter.FormatSuggestionTitle(item.label, matches);
Все элементы поиска сортируются по элементам одного и того же поставщика с их оценкой. Меньшая оценка отображается вверху списка элементов (сортировка по возрастанию).
API асинхронного поиска
Вы можете использовать асинхронный API fetchItems, когда поисковому провайдеру требуется много времени для вычисления результатов или он полагается на асинхронную поисковую систему, такую как WebRequests.
Чтобы использовать асинхронный API, функция fetchItems возвращает IEnumerable. IEnumerable должен быть функцией, которая выдает результаты, чтобы API мог получать по одному элементу за раз.
Когда возвращается IEnumerable, перечислитель сохраняется и повторяется во время обновления приложения. Перечисление продолжается в течение нескольких обновлений приложения, пока оно не будет завершено.
Время итерации ограничено, чтобы гарантировать, что UI(пользовательский интерфейс) позволяет пользователю взаимодействовать с вашим приложением. В настоящее время Unity поддерживает три системы пользовательского интерфейса. Подробнее
См. в Словарь не заблокирован. Однако, поскольку вызов находится в основном потоке, вы должны как можно скорее выполнить его, если результаты еще не готовы.
В следующем примере показано, как использовать асинхронный API fetchItems:
public class AsyncSearchProvider : SearchProvider
{
public AsyncSearchProvider(string id, string displayName = null)
: base(id, displayName)
{
fetchItems = (context, items, provider) => FetchItems(context, provider);
}
private IEnumerable FetchItems(SearchContext context, SearchProvider provider)
{
while(ResultsNotReady())
{
yield return null;
}
var oneItem = // Get an item
yield return oneItem;
var anotherItem = // Get another item
yield return anotherItem;
if(SomeConditionThatBreaksTheSearch())
{
// Search must be terminated
yield break;
}
// You can iterate over an enumerable. The enumeration
// continues where it left.
foreach(var item in someItems)
{
yield return item;
}
}
}
AssetStoreProvider.cs: запрашивает Asset Storeрастущую библиотеку бесплатные и коммерческие активы, созданные Unity и членами сообщества. Предлагает широкий спектр ресурсов, от текстур, моделей и анимации до целых примеров проектов, руководств и расширений редактора. Подробнее
См. в Словарь с помощью WebRequest.ESS.cs: создает процесс для запуска индексатора поиска Entrian Source, который обеспечивает полнотекстовый поиск активов в вашем проекте.

