Запуск основной сцены (MainScene) не требует подготовки. Реализовано следующее:
- Создание изначального инвентаря заданного размера
- Генерация случайных предметов для возможности взаимодействовать с ними. Есть кнопка регенерации для создания новой партии
- Информация о предметах отображается при наведении (тултип) и клике (окно взаимодействия). Предметы можно использовать (уменьшает количество на 1) или выбросить (удаляет предмет из инвентаря). Бонусом есть проверка на то, находится ли предмет в инвентаре, и если нет, то кнопки не работают
- У предметов есть число - количество, они успешно стакаются в один, что отображается и визуально, и в списке инвентаря. Бонус: если предмет не стакаемый, количество на будет отображаться на маленькой иконке
- Предметы перемещаются по слотам инвентаря, и все изменения отображаются на списке предметов. При попытке перетащить предмет не на слот он будет возвращён на своё предыдущее место
- Работает сохранение и загрузка инвентаря. Загрузка полностью очищает текущий инвентарь и вместо него раскладывает по местам сохранённые предметы
Игровая логика разбита на две основные части - инвентарь с предметами и UI.
Основные классы для хранения информации о предметах - ItemData, Inventory и GameDataHolder.
ItemData: ScriptableObject. Содержит следующую информацию о предмете:
- Наименование
- Описание
- Спрайт
- Тип (enum)
- Булево поле для указания возможности стакаться Хорошо бы объединить enum с параметрами стаков, по типу "все оружия не стакаются, все ресурсы стакаются".
GameDataHolder: статичный объект-хранитель, который забирает из папки Resources созданные инстанции ItemData и держит их в списке, доступном из любого места игры. Был создан изначально для генерации случайных предметов, и нагло скоммунизден из другого моего проекта :D
Inventory: статичный объект, отвечающий за список предметов и его изменение. Имеет дочерний класс InventoryItemData (был структурой, но структура - статичная копия, а не динамическая ссылка с изменением параметров на лету), нужный для хранения такой информации о предметах, как количество и индекс в инвентаре. Инвентарь - статичный, потому что добавление предметов в него может понадобиться из любого места игры (при условии, что она однопользовательская).
UI разбит на четыре основных класса: инвентарь, слот, предмет и система подсказок. InventoryUI: основной класс для работы с визуальным отображением инвентаря. Хранит список ячеек, заполняет их предметами при генерации и при загрузке сохранения.
InventorySlot: простейший класс-хранилище, у которого два поля - ссылка на предмет в ячейке и индекс ячейки. Мог бы быть частью InventoryUI, но висит на префабе слота, потому что инстанциировать кусочек класса я не очень понимаю, как :D
InventoryUIItem: самый жирный из всех классов, в котором содержится логика работы предмета и триггерятся функции из Inventory. Отвечает за драг'н'дроп и всякие проверки, которые по-хорошему бы положить в другое место, но у меня кончились варианты, как можно было бы улучшить ситуацию.
UITooltipSystem: отдельный класс для отображения тултипов и окна взаимодействия. Мог бы быть частью InventoryUI, но в целом наличие отдельного независимого объекта для такой вещи, как отображение информации, показалось мне более удобным.