Lyra Inventory Fix 02: Подсистема для фрагментов инвентаря. Решаем TODO с умом.
Ох уж эти TODO от Epic Games... Они как забытые под диваном носки. Вроде лежат себе тихо, но каждый раз, проходя мимо, ты слышишь их злобный шёпот: «Вернись… Не оставляй меня здесь…». И вот, заглянув под этот пыльный диван, мы находим его — LyraInventoryItemDefinition.h 49-я строка. Там, как надгробие, красуется надпись: // TODO: Make into a subsystem instead?
Прямо перед ULyraInventoryFunctionLibrary. Что ж, пора отправить этот реликт прошлого на заслуженную пенсию.
В своих потугах будем использовать UE5.5.0.
Почему подсистема?
Подсистемы в Unreal Engine — это как надёжный босс, который держит всё под контролем. Они живут на глобальном уровне, управляют данными централизованно и избавляют нас от бардака.
В нашем случае подсистема для инвентаря — это идеальный выход. Мы получаем:
- Глобальный доступ к инвентарям из любой точки игры, без танцев с бубном.
- Чистый кодвместо разбросанных по всему проекту кусочков логики.
- Меньше дублирования, больше порядка.
Создаём новую подсистему: ULyraInventorySubsystem
Достаем инструменты. Разбираем старьё. Собираем новый, сияющий механизм.
LyraInventorySubsystem.h
LyraInventoryFragmentSubsystem.cpp
Что тут происходит?
Мы избавились от дерьма и собрали что-то стоящее. Теперь у нас GameInstanceSubsystem, который:
- Централизует работу с инвентарями— один босс управляет всеми ресурсами, никакого бардака.
- Добавляет метод поиска: FindItemDefinitionFragment — ищет фрагменты в определении предмета, быстро и без головной боли.
Обновляем старый код
Теперь настало время интегрировать новую подсистему в существующие классы. Удаляем старый мусор, который когда-то считался рабочим решением.
LyraInventoryItemDefinition.h
Что мы сделали и зачем это нужно?
Мы взяли хаос и превратили его в порядок. Создали ULyraInventorySubsystem — теперь инвентарь живёт в GameInstanceSubsystem, а не разбросан по всему коду.
- Централизованное управление — единая точка доступа ко всем инвентарям.
- Удобство и скорость — больше не нужно лазить по классам в поисках нужных данных.
Добавили два ключевых метода:
- FindItemDefinitionFragment — находит фрагмент в определении предмета, быстро и чётко.
- GetAllInventoryComponents() — возвращает все ULyraInventoryManagerComponent, потому что всё, что связано с инвентарём, должно быть под контролем.
Обратная совместимость
- Мы не рушим мосты, мы строим новые.
- Старые методы — deprecated.
- Добавлены предупреждения, чтобы все медленно, но верно переехали на новую систему.
Использование новой системы
В C++:
В Blueprint:
- Функции подсистемы доступны из Blueprint.
- Поддержка выводного типа через метаданные.
Соглашусь, пока что функционал катастрофически мал для оправдания затраченных сил, НО... это только начало.
Что дальше? Возможности для расширения
Мы не просто закрыли очередной TODO. Мы открыли дверь. Теперь система инвентаря не тупо работает — она готова к росту.
Хочешь новые возможности? Легко. Подсистема масштабируется без боли и рефакторинга.
Я планирую развивать её дальше, превращая в универсальную модульную систему инвентаря на базе Lyra. И если вам нужна мощная, гибкая система — добро пожаловать.
Вывод
- 49-я строка больше не шепчет проклятия.
- TODO превратился в рабочий инструмент.
- Теперь инвентарь не раскидан по коду, а централизован.
- Теперь добавлять новые возможности — не страдание, а удовольствие.
Как говорится, "Старый код не умирает, он просто становится частью подсистемы".