Фильтрация и сортировка
Система фильтрации и сортировки позволяет управлять отображением предметов в инвентаре без изменения самих данных. Предметы остаются на своих местах --- меняется только то, как они показаны игроку.
Общая схема
flowchart LR
A["Инвентарь\n(все предметы)"] --> B["Фильтр\n(что показывать)"]
B --> C["Сортировка\n(в каком порядке)"]
C --> D["Отображение"]
Данные инвентаря не изменяются. Фильтрация и сортировка влияют только на видимость и порядок слотов в UI.
Режимы фильтра
Когда предмет не проходит фильтр, он может быть обработан одним из трёх способов:
| Режим | Что происходит |
|---|---|
| Скрыть (Hide) | Слот скрывается (SetActive(false)) |
| Затемнить (Dim) | Слот остаётся видимым, но становится неактивным (затемнённый, некликабельный) |
| Переместить в конец (MoveToEnd) | Слот сдвигается в конец списка и становится неактивным |
Встроенные фильтры
Все фильтры --- [Serializable] классы, реализующие ISlotFilter. Встраиваются через [SerializeReference] в любой MonoBehaviour или ScriptableObject:
| Фильтр | Описание | Требование к предмету |
|---|---|---|
CategoryFilter |
Показать только предметы заданной категории | IFilterable |
RarityRangeFilter |
Показать предметы в диапазоне редкости (min--max) | IFilterable |
NameSearchFilter |
Поиск подстроки по имени предмета | --- |
CompositeFilter |
Комбинирует несколько фильтров с логикой AND/OR | --- |
Встроенные сортировщики
Все сортировщики --- [Serializable] классы, реализующие ISlotSorter:
| Сортировщик | Сортирует по | Требование к предмету |
|---|---|---|
NameSorter |
DisplayName |
--- |
CategorySorter |
IFilterable.Category |
IFilterable |
RaritySorter |
IFilterable.Rarity |
IFilterable |
SortValueSorter |
ISortable.SortValue |
ISortable |
StackCountSorter |
Количество в стаке | --- |
CompositeSorter |
Цепочка сортировщиков (первый ненулевой результат побеждает) | --- |
Все сортировщики поддерживают направление (asc/desc) через контроллер.
Настройка через Inspector
- Добавьте
FilterSortControllerна GameObject инвентаря. - Создайте ассеты фильтров/сортировщиков:
- Create > DragAndDrop > Filter > Slot Filter --- ассет фильтра (
SlotFilterSO). Тип фильтра выбирается через[SerializeReference]пикер. - Create > DragAndDrop > Filter > Slot Sorter --- ассет сортировщика (
SlotSorterSO). - Create > DragAndDrop > Filter > Filter Sort Preset --- комбинированный пресет (
FilterSortPreset) с фильтром + сортировщиком + режимом отображения.
- Create > DragAndDrop > Filter > Slot Filter --- ассет фильтра (
- Добавьте кнопки:
FilterButton--- применяетSlotFilterSOпо клику.SortButton--- применяетSlotSorterSOпо клику. Поддерживает переключение направления.FilterSortButton--- применяет комбинированныйFilterSortPresetпо клику.
Примеры через код
var controller = inventory.GetComponent<FilterSortController>();
// Использование [Serializable] экземпляра фильтра
var filter = new CategoryFilter { Category = "Weapon" };
controller.SetFilter(filter);
// Сортировка [Serializable] сортировщиком
controller.SetSorter(new RaritySorter(), ascending: false);
// Сбросить всё
controller.ClearAll();
// Лямбда-фильтр (захватывает живые значения)
controller.SetFilter((in FilterContext ctx) =>
{
if (ctx.Slot.Stack?.PrimaryAdapter is not IFilterable f) return false;
return f.Rarity >= minRaritySlider.value;
});
// После изменения полей активного фильтра в рантайме:
((CategoryFilter)controller.ActiveFilter).Category = "Armor";
controller.Refresh();
Ассеты и кнопки
- SlotFilterSO --- ScriptableObject-обёртка для
ISlotFilter. ИспользуетсяFilterButton. - SlotSorterSO --- ScriptableObject-обёртка для
ISlotSorter. ИспользуетсяSortButton. - FilterSortPreset --- ScriptableObject, объединяющий фильтр + сортировщик + режим отображения + направление. Используется
FilterSortButton. - FilterButton --- UI-кнопка, применяющая/сбрасывающая
SlotFilterSO. Поддерживает toggle-режим. - SortButton --- UI-кнопка, применяющая/сбрасывающая
SlotSorterSO. Поддерживает toggle-режим и переключение направления. - FilterSortButton --- UI-кнопка, применяющая/сбрасывающая комбинированный
FilterSortPreset. Поддерживает toggle-режим и переключение направления.
Справочник классов
| Класс | Роль |
|---|---|
ISlotFilter |
Базовый интерфейс фильтра (Evaluate(in FilterContext)) |
ISlotSorter |
Базовый интерфейс сортировщика (Compare(in FilterContext, in FilterContext)) |
FilterContext |
Контекст: Slot, Inventory, AllSlots, SlotIndex |
FilterSortController |
Контроллер: применяет фильтр и сортировку к инвентарю |
SlotFilterSO |
SO-обёртка для переиспользуемых ассетов фильтров |
SlotSorterSO |
SO-обёртка для переиспользуемых ассетов сортировщиков |
FilterSortPreset |
ScriptableObject: комбинированный пресет фильтра + сортировки |
FilterButton |
UI-кнопка для одного фильтра |
SortButton |
UI-кнопка для одного сортировщика |
FilterSortButton |
UI-кнопка для комбинированного пресета |
IFilterable |
Интерфейс предмета: Category, Subcategory, Rarity |
ISortable |
Интерфейс предмета: SortValue, SortName |