Перейти к содержанию

Введение

Ассет для Unity, позволяющий внедрить систему инвентарей и перетаскивания между ними в любой проект с любыми данными. Он решает задачи такие как:

  • отображение данных в UI инвентаря
  • перенос предметов между инвентарями
  • стакинг, swap и быстрый перенос
  • синхронизация изменений UI с вашими игровыми данными
  • добавление проверок и правил для возможности переноса
  • создание специальных действий для инвентарей
  • контекстное меню
  • множественное выделение и перенос
  • работа с предметами сложной формы

Он подходит и как для простых UI-инвентарей и сценариев вроде экипировки, так и для реализации сложной логики вроде торговли и поддержки серверных проверок.

Что это за ассет

Это не просто набор UI-слотов, а система, которая, в отличие от многих альтернативных решений, требующих чтобы ваши данные соответствовали определенному типу, позволяет визуализировать в инвентаре практически любые ваши данные:

  • ScriptableObject
  • runtime-модели
  • списки, словари и фиксированные поля
  • разные представления одного и того же предмета в разных инвентарях

Ключевая идея в том, что визуальный инвентарь отделён от вашей игровой модели.

В системе предусмотрено множество точек расширеня, благодаря этому систему можно постепенно наращивать:

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

То есть ассет рассчитан не только на быстрый старт, но и на дальнейшее масштабирование без полного переписывания инвентарной логики.

Warning

Для своих типов данных обычно нужно написать немного интеграционного кода.

Важно сразу понимать и цену этой гибкости: для своих типов данных обычно нужно написать немного интеграционного кода.

Это нужно чтобы система поняла:

  • как и какие данные получить из ваших классов
  • как представить ваши данные в слотах инвентаря
  • как записать изменения от UI взаимодействий обратно в ваши модели данных

Чтобы любой тип мог отображаться в слотах инвентаря нужно написать специальный переходник для него от данных к слоту - адаптер.

Обычно это небольшой адаптер и один DataBinding. Чем более сложная у вас модель данных, тем толще будет этот слой интеграции, но сам drag & drop, swap, stacking, переносы и event flow уже берёт на себя ассет.

Для некоторых распространенных вариантов уже есть шаблонные классы DataBinding с которыми будет проще настроить большинство вариантов.

Зависимости

  • Обязательный пакет: Unity.ugui
  • Опциональный пакет: com.unity.inputsystem

Базовая часть ассета компилируется и работает без com.unity.inputsystem. Новый Input System нужен только для функций, построенных вокруг InputAction. Отслеживание pointer/navigation-модальности тоже работает в проектах на legacy input.

Базовая модель

Для большинства проектов полезно держать в голове ровно эту схему:

flowchart LR
    Inventory@{ shape: rounded, label: "<b>Universal Inventory</b>\nзанимается обработкой UI состояний, переносов и распределением предметов по слотам" }

    Slot@{ shape: rounded, label: "<b>Universal Slot</b>\nСодержит адаптер и количество предметов в слоте" }

    Adapter@{ shape: rounded, label: "<b>IItem Adapter</b>\nХранит ссылку на предмет с данными" }
    style Adapter fill:#FF44

    Binding@{ shape: rounded, label: "<b>Data Binding</b><br/>синхронизирует ваши данные с UI" }
    style Binding fill:#FF44

    Data@{ shape: rounded, label: "Ваши модели данных" }

    Inventory --> Slot    
    Slot --> Adapter
    Binding <--> Data    
    Inventory <--> Binding
  • IItemAdapter нужно определить чтобы слот корректно хранил данные
  • DataBinding нужно определить чтобы корректно редактировал данные в соответсвии с изменениями в UI

Подсистемы

  • Отображение данных в инвентаре
  • Перенос между инвентарями
  • Области дропа
  • Система правил
  • Настраиваемые действия
  • автоперенос
  • Множественное выделение
  • Множественный перенос
  • Контекстное меню
  • Пример tooltip
  • Пример конвертаций типов при переносе
  • Пример вложенных инвентарей
  • Пример предметов сложной формы

См. также: