版本:Unity 6 (6000.0)
语言:English
注册搜索提供程序
注册操作处理程序

执行搜索

搜索提供程序使用 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);

SearchProvider 必须将新的 SearchItem 添加到 items 列表中,或返回 IEnumerable<SearchItem>

注意:如果您不使用异步 fetchItems API,则必须在 fetchItems 函数中返回 null

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);

所有搜索项目都根据其 score 与同一提供程序的项目进行排序。较低的得分显示在项目列表的顶部(升序排序)。

异步搜索 API

当搜索提供程序需要很长时间才能计算其结果或依赖于异步搜索引擎(如 WebRequests)时,您可以使用异步 fetchItems API。

要使用异步 API,请让 fetchItems 函数返回 IEnumerable<SearchItem>IEnumerable<SearchItem> 应该是一个产生结果的函数,以便 API 可以一次获取一个项目。

当返回 IEnumerable<SearchItem> 时,枚举器会被存储并在应用程序更新期间迭代。枚举会持续多个应用程序更新,直到完成。

迭代时间受到限制,以确保 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 词汇表
不被阻塞。但是,由于调用是在主线程中进行的,因此如果结果未准备好,您应该尽快让出控制权。

以下示例演示了如何使用异步 fetchItems API

public class AsyncSearchProvider : SearchProvider
{
    public AsyncSearchProvider(string id, string displayName = null)
        : base(id, displayName)
    {
        fetchItems = (context, items, provider) => FetchItems(context, provider);
    }

    private IEnumerable<SearchItem> 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:使用 WebRequest 查询 Asset Store一个不断增长的免费和商业资产库,由 Unity 和社区成员创建。提供各种各样的资产,从纹理、模型和动画到完整的项目示例、教程和编辑器扩展。 更多信息
    参见 词汇表
  • ESS.cs:创建一个进程来启动 Entrian Source 搜索索引器,该索引器提供项目中资产的全文搜索。
注册搜索提供程序
注册操作处理程序