Lyra Inventory Fix 03: Исправляем UE-127172. Делаем как надо, а не как "пока работает"
И снова TODO в Lyra… 93-я строка LyraInventoryManagerComponent.cpp. Очередное вырубленное в камне послание от Epic Games: TODO: Using the actor instead of component as the outer due to UE-127172.
Всё ясно. Тодошка из отряда костылеобразных. Как говорится, «нет ничего более постоянного, чем временное решение».
Но не сегодня.
Сегодня мы выкорчуем этот костыль и сделаем как надо.
Пора перестать плясать вокруг багов и управлять экземплярами предметов грамотно и централизованно.
В чем проблема?
Баг UE-127172 заставил разработчиков использовать актор вместо компонента в качестве Outer для экземпляров предметов.
А это:
- Ломает иерархию владения— предметы должны принадлежать компоненту, а не актору.
- Убивает модульность— чем больше привязок к акторам, тем сложнее гибко управлять инвентарём.
- Портит отладку— если что-то идёт не так, готовьтесь к головной боли.
- Выглядит как костыль — такой код лучше не показывать никому.
Наше решение: подсистема как менеджер экземпляров предметов
Мы добавим централизованное управление жизненным циклом предметов через реализованную в прошлый раз подсистему ULyraInventorySubsystem. То, что должно было быть изначально.
Больше никаких «временных решений». Только чистый, логичный, мощный код.
Спойлер: Для выполнения дальнейших телодвижений необходимо завершить предыдущий гайд: Lyra Inventory Fix 02: Подсистема для фрагментов инвентаря. Решаем TODO с умом.
Теперь подсистема — станет боссом. Она начнет управлять.
- Создавать экземпляры предметов— централизованно, без хаоса.
- Инициализировать их правильно— без костылей, как и должно быть.
- Контролировать их жизненный цикл — удалит ненужное, очистит мусор.
Теперь экземпляры предметов будут принадлежать системе, а не расползутся по акторам, как бездомные. Не будет багов с владением — всё структурировано и предсказуемо.
В своих потугах будем использовать UE5.5.0.
Добавляем методы в ULyraInventorySubsystem
Новые методы:
- CreateInventoryItemInstance — создаёт экземпляр предмета и настраивает его внешний объект (outer).
- InitializeItemInstance — выполняет дополнительную инициализацию экземпляра.
- ManagedItems — массив для отслеживания всех созданных экземпляров.
LyraInventorySubsystem.cpp:
Что происходит?
Теперь всё под контролем.
- Экземпляр привязывается к компоненту, а не к актору. Больше никаких левых владельцев. Правильная иерархия.
- Все экземпляры хранятся в ManagedItems.Теперь мы управляем их жизненным циклом, а не надеемся на удачу.
- При деинициализации подсистемы ManagedItems очищается. Никаких утечек памяти. Всё чисто и логично.
Обновляем FLyraInventoryList::AddEntry
Раньше мы колхозили. Создавали экземпляры кустарно, надеясь, что всё не рухнет. Теперь всё по уму — используем нашу подсистему.
Инвентарь больше не стихийное бедствие. Теперь он управляемый процесс.
LyraInventoryManagerComponent.cpp:
Изменения:
- AddEntry вызывает метод CreateInventoryItemInstance из подсистемы.
- Внешним объектом (outer) теперь корректно выступает компонент, а не актор.
- Инициализация экземпляра проводится через InitializeItemInstance.
LyraInventoryItemInstance.h:
Что мы сделали?
Мы разобрались с хаосом. Теперь экземпляры предметов — не беспризорники, а управляемые ресурсы.
- Централизованное управлениечерез подсистему.
- Компонент — главный, актор больше не вмешивается.
- UE-127172 — отправлен в могилу.
Добавленные возможности
- Масштабируемость — кастомная логика создания предметов? Без проблем.
- Жизненный цикл под контролем — никаких утечек, никаких зомби-объектов.
- Оптимизация — массив экземпляров теперь под присмотром.
Преимущества нового подхода
- Чистый код— логика создания и управления в одном месте.
- Правильная иерархия— предметы принадлежат кому надо.
- Гибкость— добавляем пуллинг, асинхронность, что угодно.
- Blueprint-дружественность — новы�� методы CreateInventoryItemInstance и InitializeItemInstance доступны из BP.
Вывод
Теперь подсистема управляет всем, следит за порядком и даже заметает следы за собой.
Как говорится, «Хороший код — это когда даже временные решения выглядят намеренно»,…но мы-то знаем, что лучше просто сделать всё правильно сразу.