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

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

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

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

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

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

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

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

  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    1456
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    978
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    604
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    672
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Обучающая викторина для детей «Покупки в магазине»
    28

Мы разрабатываем системы инвентаря для игр под ключ — от базового списка предметов до сложного крафта и сетевой синхронизации. За 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 подключается последним.

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

Проектирование механик: с чего начинается отзывчивое управление

Прежде чем говорить о геймдизайне, зафиксируем разграничение: геймдизайн — это не «придумать идею». Придумать может любой. Задача — спроектировать систему правил, которая производит конкретный эмоциональный и поведенческий результат. Это инженерная дисциплина, только вместо компилятора — человеческий мозг.

Первая боль: вам кажется, что управление «дубовое», а почему — непонятно. Чаще всего проблема не в коде, а в отсутствии coyote time и jump buffering. Или в линейном ускорении, которое не даёт ощущения веса. Мы это чиним на этапе прототипа.

Какие услуги геймдизайна мы предлагаем

Полный цикл: от концепта до выверенного билда. Под ключ — вы получаете геймдизайн-документ (GDD), таблицы баланса, прототип ключевых механик на Unity/Unreal, и сопровождение вплоть до релиза.

Что входит в работу:

  • Документация: GDD, спецификации механик, нарративные деревья, API для разработчиков
  • Таблицы баланса: прогрессия, экономика, DPS-калькуляторы
  • Прототипы: интерактивные сцены с core loop (движение, бой, инвентарь)
  • Конфигурация в движке: ScriptableObject, DataTable, анимационные событий
  • Проведение плейтестов и итераций по метрикам (удержание, монетизация, retention)

Оцените ваш проект — свяжитесь для расчёта сроков. Подход основан на методологии MDA и опыте 50+ реализованных проектов с 2012 года.

Как проектировать боевую систему: глубокий разбор

Боевая система — самая дорогая ошибка: на первый взгляд простая, на деле — ад из edge cases. Разберём melee combat.

1. Выбор метода hit detection

Hitbox — коллайдеры на оружии. Просто, но при быстрых атаках возникает tunneling: оружие пролетает сквозь противника за кадр. Решение — Physics.CCD (Continuous Collision Detection), но это дорого. Raycast/spherecast — кастуем лучи вдоль траектории оружия. Точнее, меньше зависит от fps. Мы предпочитаем spherecast для action-игр. Подробнее о методах — в Wikipedia.

2. Настройка окон атаки

Каждая атака — три фазы: Startup, Active, Recovery. Длинный startup создаёт «тяжёлые» удары. Короткий recovery даёт агрессивный стиль. В Unity аниматор кидает событие через AnimationEvent, код включает/выключает hitbox. Типичные тайминги для рукопашного боя: startup 200–400 мс, active 100–150 мс, recovery 300–500 мс.

3. Построение state machine

Персонаж — конечный автомат. Базовые состояния: Idle, Moving, Jumping, Attacking, Hurt, Dead. Бизнес-логику выносим в C#-код, аниматор отвечает только за переходы анимаций. Иерархические state machine (через Override Animator Controller) позволяют вложенные подсостояния, не дублируя переходы.

Почему математическая модель экономики критична?

Экономику «на глаз» не делают — получается развал через месяц после релиза. Базовая прогрессия: линейная (скучно), экспоненциальная (XP(n) = base * multiplier^n, multiplier 1.5–2.0), полиномиальная (a * n^b, b 1.5–2.5). Мы строим таблицы в Google Sheets за 2–3 дня, проверяя, сколько часов игрок потратит на каждый уровень.

Потоки валют

Принцип: каждая валюта — явный источник (tap) и сток (sink). Пример двухвалютной системы:

Мягкая валюта (золото) Твёрдая валюта (кристаллы)
Источник Квесты, враги, ежедневные награды Покупка, редкие достижения
Сток Расходники, улучшения, здания Пропуск времени, редкие предметы
Конвертация → кристаллы: нет → золото: да (однонаправленно)

Однонаправленная конвертация защищает монетизацию. Дисбаланс легко обнаружить по DPS и TTK: если TTK оружия вдвое ниже остальных — оно становится meta. Мы выявляем это на этапе прототипа, сокращая последующие правки на 40%.

Нарратив и левел-дизайн: как обучать без текста

Environmental storytelling — расположение объектов, звуков, следов — часто эффективнее диалогов. Для диалогов используем Ink (интеграция с Unity). Ink-скрипты читает нарративный дизайнер без программиста. Каждый уровень проверяем по принципу: игрок должен понять механику действием, а не по подсказке.

Инструменты в процессе

Задача Инструмент
GDD Notion, Confluence
Баланс Google Sheets (формулы, сводные)
Прототипы Unity 2022 LTS, Godot 4
State machine Miro, draw.io
Нарратив Ink, Twine
Конфиги ScriptableObject (Unity)
Аналитика Firebase, GameAnalytics

Итерация и плейтестинг: 2-недельный цикл

Первый прототип всегда неудобен — это норма. Наш цикл: плейтест каждые 2 недели. После — список изменений с числами: «startup 400 мс → 250 мс». Мнения без цифр не принимаются. Фиксируем ощущения, меняем цифры, повторяем.

Свяжитесь для консультации — мы оценим сроки и бюджет вашего проекта. Наши заказчики экономят от 2 до 3 недель на итерациях за счёт чёткого процесса.