Разработка системы инвентаря и менеджмента ресурсов в играх

Наша компания по разработке видеоигр ведет независимые проекты, совместно с клиентом создает игры и оказывает дополнительные операционные услуги. Опыт нашей команды позволяет нам охватить все игровые платформы и разработать потрясающий продукт, соответствующий видению клиента и предпочтениям игроков.

От иммерсивных приложений до игровых миров и 3D-сцен

Наша выделенная команда для VR/AR/MR-разработки, Unity-продакшна и 3D-моделирования и анимации с собственными кейсами и презентациями.

Посетить персонализированный сайт
Показано 1 из 1Все 242 услуг
Разработка системы инвентаря и менеджмента ресурсов в играх
Сложный
от 1 недели до 3 недель
Часто задаваемые вопросы

Наши компетенции

Какие этапы разработки игры?

Последние работы

  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    1397
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    933
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    558
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    605

Мы разрабатываем системы инвентаря для игр под ключ — от базового списка предметов до сложного крафта и сетевой синхронизации. За 5 лет работы выполнили более 20 проектов для Unity и Unreal. Получите консультацию по вашей задаче — оценим архитектуру и сроки за 1 день.

Система инвентаря — один из тех компонентов, которые на ранних этапах кажутся простыми («просто список предметов»), а к середине проекта превращаются в узел, с которым завязано всё: экономика, прогрессия, крафт, торговля, сохранение. Переделывать архитектуру инвентаря на этапе контент-продакшена — одно из самых болезненных занятий в геймдеве.

Типичные архитектурные ошибки, которые закладываются с самого начала

Предмет как MonoBehaviour на сцене. Распространённая ошибка у новичков: ItemComponent на GameObject, Inventory как List<ItemComponent>. Это означает, что каждый предмет в инвентаре существует как объект Unity — нельзя сериализовать без хаков, сложно клонировать, невозможно передать по сети. Правильный путь: предмет в инвентаре — это данные, а не объект сцены.

Почему разделение ItemDefinition и ItemInstance критично?

ItemDefinition — это ScriptableObject, описывающий тип предмета: название, иконка, базовые статы, stackable или нет, максимальный стек. ItemInstance — структура или класс с runtime-данными: количество, durability, случайные аффиксы, enchantment-ы. Один ItemDefinition может породить тысячи разных ItemInstance. Без этого разделения невозможно нормально реализовать ни модификаторы предметов, ни их генерацию.

Жёсткая привязка UI к данным инвентаря. Если InventorySlot напрямую читает Item.name и обновляет Text.text, то при любом рефакторинге данных ломается UI. Инвентарь должен работать без UI вообще — события (OnItemAdded, OnItemRemoved, OnItemChanged) публикуются через C# events или UnityEvent, UI подписывается на них снаружи.

Как строится надёжная архитектура

Ядро — InventoryContainer: класс с List<ItemSlot> где ItemSlot хранит ItemDefinition reference + ItemInstance data + int quantity. Контейнер не знает, чей он — игрока, сундука, магазина. Это позволяет использовать одну систему для всего.

ItemDatabase — ScriptableObject или адресируемый ассет с Dictionary<string, ItemDefinition> по GUID. GUID предмета — строка, не int-ID: это упрощает мёрдж при командной работе и не ломается при добавлении новых предметов.

Операции над инвентарём — методы контейнера: TryAdd(ItemDefinition, quantity), TryRemove(ItemDefinition, quantity), TryMove(fromSlot, toContainer, toSlot). Каждый метод возвращает bool или InventoryOperationResult с кодом ошибки (не хватает места, предмет не найден, слот заблокирован). Никаких void-методов для операций с данными.

Стекирование и уникальные предметы

Стекируемые ресурсы (дерево, золото, патроны) и уникальные предметы с аффиксами требуют разной логики добавления. TryAdd проверяет itemDef.isStackable — если да, ищет существующий слот с тем же ItemDefinition и дополняет до maxStackSize, остаток кладёт в новый слот. Если !isStackable — каждый экземпляр занимает отдельный слот с собственным ItemInstance.

Сортировка инвентаря — алгоритм, который переставляет слоты по категориям и внутри категории по имени. Реализуется через List.Sort() с кастомным IComparer<ItemSlot> и анимируется через coroutine с поочерёдным свапом позиций — иначе визуально неразличимо, что произошло.

Сохранение состояния инвентаря

Сериализация — отдельная задача. ItemInstance должен сериализоваться в JSON-friendly структуру: { "defGuid": "abc123", "quantity": 5, "durability": 87, "affixes": [...] }. Unity JsonUtility плохо работает с полиморфизмом — для сложных ItemInstance с наследованием лучше Newtonsoft.Json (через com.unity.nuget.newtonsoft-json) с кастомными конвертерами.Согласно официальной документации Unity, JsonUtility не поддерживает наследование — используйте сторонние библиотеки для сложных моделей.

При загрузке сохранения: десериализуем список слотов, по GUID ищем ItemDefinition в ItemDatabase, восстанавливаем ItemInstance. Если ItemDefinition с таким GUID не найден (контент удалён) — слот помечается как orphaned и не вызывает краш.

Кейс: инвентарь для MMO-шутераПроект с 200+ уникальными предметами и процедурной генерацией аффиксов. Без разделения Definition/Instance пришлось бы создавать 200 ScriptableObject-ов, а каждый предмет с аффиксами — отдельный экземпляр. Решение: 40 Definition-ов, Instance генерируются на лету. Сохранение — 5 мс на 10 000 предметов. UI обновляется по событиям, сортировка — 0.2 мс.

Таблица ориентировочных сроков

Масштаб Состав Срок
Минимальный Список предметов, добавить/убрать, UI-слоты 3–7 дней
Базовый Стекирование, ItemDefinition/Instance, сохранение 1–2 недели
Средний Крафт, экипировка, drag & drop UI, фильтры 3–5 недель
Полный Генерация аффиксов, торговля, сетевая синхронизация 2–3 месяца

Менеджмент ресурсов: когда инвентарь — это не только предметы

В стратегиях и survival-играх ресурсы (дерево, еда, электричество) живут не в слотах инвентаря, а в ResourceSystem — глобальном или привязанном к структуре реестре с Dictionary<ResourceType, float>. Обновление происходит через Tick каждые N секунд игрового времени, а не в Update() каждый кадр.

Производители и потребители ресурсов регистрируются в ResourceSystem через интерфейс IResourceProducer / IResourceConsumer. Это позволяет добавлять новые здания без изменения ядра системы. Баланс ресурсных потоков проверяется в редакторском инструменте ещё до запуска — таблица с текущим производством и потреблением по типам обновляется в custom Editor Window через EditorApplication.update.

Что входит в разработку системы инвентаря

  • Архитектура: ItemDefinition / ItemInstance, InventoryContainer, ResourceSystem
  • Реализация операций: добавление, удаление, перемещение, сортировка, стекование
  • Сериализация и сохранение: JSON, бинарный вариант, сжатие
  • UI: кастомные слоты, drag & drop, фильтры, категории (если требуется — под геймпад или мобильное управление)
  • Оптимизация: object pooling, адресация ассетов, асинхронная загрузка
  • Интеграция с крафтом, торговлей, экипировкой, сетевой синхронизацией
  • Юнит-тесты: покрытие всех операций, включая граничные случаи
  • Документация: описание архитектуры, инструкция по конфигурации, руководство для контент-мейкеров
  • Деплой и поддержка: помощь при интеграции в уже существующий проект

Процесс работы

Проектирование начинается с таблицы всех типов предметов и их свойств — до написания кода. Сколько уникальных предметов планируется? Есть ли генерируемые? Нужен ли крафт? Это определяет глубину архитектуры. Прототип InventoryContainer без UI пишется первым и покрывается юнит-тестами в Unity Test Runner — добавление, удаление, переполнение, сохранение/загрузка. UI подключается последним.

Свяжитесь с нами, чтобы обсудить ваш проект. Получите оценку архитектуры и сроков за один рабочий день.