SearchProvider 클래스는 특정 유형의 아이템에 대한 검색을 실행하고 썸네일, 설명, 하위 필터를 관리합니다.
다음과 같은 기본 API를 갖추고 있습니다.
public class SearchProvider
{
    public SearchProvider(string id, string displayName = null);
    // Creates an Item bound to this provider.
    public SearchItem CreateItem(string id, string label = null, string description = null, Texture2D thumbnail = null);
    // Utility functions to check whether the search text matches a string.
    public static bool MatchSearchGroups(string searchContext, string content);
    public static bool MatchSearchGroups(string searchContext, string content,
                                        out int startIndex, out int endIndex);
    // The provider's unique ID.
    public NameId name;
    // Text token to "filter" a provider (for example, "me:", "p:", and "s:").
    public string filterId;
    // This provider is only active when a search explicitly specifies it with
    // its filterId.
    public bool isExplicitProvider;
    // Handler to fetch and format the label of a search item.
    public FetchStringHandler fetchLabel;
    // Handler to provide an async description for an item. Called just before
    // Search displays the item.
    // Allows a plug-in provider to fetch long descriptions only when
    // Search needs them.
    public FetchStringHandler fetchDescription;
    // Handler to provider an async thumbnail for an item. Called just before
    // Search displays the item.
    // Allows a plug-in provider to fetch/generate previews only when
    // Search needs them.
    public PreviewHandler fetchThumbnail;
    // Handler to support drag interactions. It is up to the SearchProvider
    // to properly set up the DragAndDrop manager.
    public StartDragHandler startDrag;
    // Called when the selection changes and Search can track it.
    public TrackSelectionHandler trackSelection;
    // MANDATORY: Handler to get items for a search context.
    public GetItemsHandler fetchItems;
    // A Search Provider can return a list of words that help the user complete
    // their search query.
    public GetKeywordsHandler fetchKeywords;
    // List of sub-filters that are visible in the FilterWindow for a
    // SearchProvider (see AssetProvider for an example).
    public List<NameId> subCategories;
    // Called when the Search window opens. Allows the Provider to perform
    // some caching.
    public Action onEnable;
    // Called when the Search window closes. Allows the Provider to release
    // cached resources.
    public Action onDisable;
    // Int to sort the Provider. Affects the order of search results and the
    // order in which providers are shown in the FilterWindow.
    public int priority;
    // Called when Search opens in "contextual mode". If you return true
    // it means the provider is enabled for this search context.
    public IsEnabledForContextualSearch isEnabledForContextualSearch;
}
검색 창을 시작하면 리소스를 캐시하는 데 사용할 수 있는 onEnable이 호출됩니다.
검색 창을 닫으면 리소스를 릴리스하는 데 사용할 수 있는 onDisable이 호출됩니다.
검색 아이템 리스트는 가상 스크롤 알고리즘을 사용하기 때문에, 일부 SearchItem 필드(예: label, thumbnail , description)가 아직 제공되지 않은 경우 요청 시 페치됩니다.
아이템이 생성된 후 해당 필드를 채우려면 SearchProvider를 특정 핸들러(fetchLabel, fetchDescription, fetchThumbnail)로 초기화해야 합니다.
trackSelection에 콜백을 등록하면 마우스나 키보드를 사용하여 검색 결과에서 아이템을 선택할 때마다 검색을 수행하도록 할 수 있습니다. 예를 들어, 에셋과 씬 공급자는 trackSelection 콜백을 사용하여 검색에서 선택한 아이템 정보를 주고 받습니다.
일부 검색 공급자는 씬으로 끌어다 놓을 수 있는 아이템을 반환합니다. 아이템이 드래그 앤 드롭을 지원하는 커스텀 공급자를 생성하는 경우, startDrag를 구현합니다.
예를 들어, 에셋과 씬 공급자는 올바른 드래그 앤 드롭 상호 작용을 허용하기 위해 관련 아이템 UID로 DragAndDrop 구조를 채웁니다.
Alt Shift + C 단축키로 검색 창을 열면 컨텍스트 검색을 시작합니다. 즉, 포커스가 있는 창을 검색합니다.
컨텍스트 검색을 시작할 때 isEnabledForContextualSearch를 오버라이드하는 공급자를 다음 예제와 같이 활성화해야 하는지 확인합니다.
// Taken from Scene hierarchy provider:
// Makes the provider part of the contextual search if the Scene view or the
// Hierarchy window has focus.
isEnabledForContextualSearch = () =>
                QuickSearchTool.IsFocusedWindowTypeName("SceneView") ||
                QuickSearchTool.IsFocusedWindowTypeName("SceneHierarchyWindow");