Lyra Inventory Fix 01: Фильтрация предметов. Когда порядок — не роскошь, а необходимость.
Epic Games снова кинули нас, оставив в LyraInventoryManagerComponent.cpp полуфабрикат. Очередной недоношенный ребёнок разработки — фильтры инвентаря.
Вот где зарыта собака: закомментированные строки с ULyraInventoryFilter и его производным ULyraInventoryFilter_HasTag.
Код как бы есть, но его как бы нет. Будто кто-то начал делать, отвлёкся на мемы в Твиттере и забыл допилить. Нам остаётся только дописать этот недостающий кусок, чтобы он не оставил нас с головной болью, а работал как надо.
В своих потугах будем использовать UE5.5.0
Базовый функционал: ULyraInventoryFilter
Начнём с основ. ULyraInventoryFilter — это абстрактный класс, задающий интерфейс для фильтрации предметов. Его сердце — виртуальный метод PassesFilter. Он решает, проходит ли объект проверку или идёт лесом. Наследники смогут переопределять его, задавая свои правила отбора.
И да, добавим поддержку Blueprint. Потому что даже те, кто боится C++ больше, чем налоговую, должны иметь возможность ковыряться в этом механизме.
LyraInventoryFilter.h
LyraInventoryFilter.cpp
Конкретные фильтры: бери и пользуйся
Теперь натягиваем на скелет мясо. Берём базовый класс и клепаем три полезных фильтра:
ULyraInventoryFilter_ItemDefinition
Фильтр для элиты. Работает на уровне классов и позволяет искать предметы по их типам. Учитывает наследование — если фильтруете по родительскому классу, то и его наследники пройдут проверку.
ULyraInventoryFilter_HasTag
Прямолинейный, как лом. Ищет предметы по тегам. Если тег есть — пропускает, если нет — идёт лесом.
ULyraInventoryFilter_Composite
Мозговитый. Позволяет комбинировать несколько фильтров, создавая сложные условия.
- AND — все фильтры должны быть пройдены.
- OR — хотя бы один фильтр должен быть пройден.
С этим зверем можно строить логические цепочки, сложные, но элегантные. Больше никакой лапши-кода, только красота и модульность.
Добавляем фильтрацию в LyraInventoryManagerComponent
Теперь на сцену выходит GetFilteredItems — метод в ULyraInventoryManagerComponent, который принимает фильтр и возвращает отфильтрованный список предметов.
Работает безопасно — фильтр не передан? Не беда, просто вернёт пустой массив, а не уйдёт в закат с ошибкой. Никаких неожиданных вылетов, только контроль и порядок.
LyraInventoryManagerComponent.h
LyraInventoryManagerComponent.cpp
Как это использовать: простота — сестра таланта
Что в итоге?
Мы не просто подчинили фильтры — мы сделали их такими, какими они должны были быть с самого начала.
- Просто — код не вызывает когнитивный диссонанс, а пользоваться им можно без ритуалов с бубном.
- Расширяемо — хочешь новый фильтр? Просто наследуйся от ULyraInventoryFilter и делай, что вздумается.
- Гибко — комбинируй фильтры в ULyraInventoryFilter_Composite и строй логические конструкции уровня «убийца-головоломка».
- Доступно для Blueprint — даже если C++ для тебя тёмный лес, ты всё равно сможешь собрать свой фильтр без боли.
- Грамотно встроено в Lyra — использует систему геймплейных тегов, идеально ложится в архитектуру проекта.
Теперь хаоса в инвентаре нет. Теперь это контролируемый порядок. С такими фильтрами найти нужный предмет проще, чем потерять его.