Что это: контракт и утилиты для сериализации уникального состояния экземпляра предмета (JSON внутри InventoryItemInstance.ComponentStates), одна запись на компонент с ключом InventoryStateKey. Используется вместе с InventoryItemData.Supports Instance State. Файлы: Core/IInventoryItemState.cs, Runtime/InventoryItemStateBehaviour.cs, Runtime/InventoryItemStateUtility.cs.
| Что | Роль |
|---|---|
| InventoryItemStateBehaviour | Твой скрипт на префабе предмета. Ты наследуешь класс и пишешь что сохранять (патроны, прочность, текст ключа) в CaptureInventoryState и как вернуть это в RestoreInventoryState. Без этого инвентарь не знает про твои поля — это единственное место с игровой логикой предмета. |
| InventoryItemStateUtility | Общий служебный код не для наследования. Он обходит все IInventoryItemState на префабе, вызывает у каждого Capture при подборе и Restore при спавне из инвентаря. PickableItem / InventoryDropper / рука пользуются им внутри — тебе руками вызывать не обязательно, если только не делаешь свой пайплайн. |
Коротко: Behaviour = данные одного типа предмета; Utility = один раз «собрать все такие компоненты с префаба» при pickup/drop.
Как использовать:
- В
InventoryItemDataвключите Supports Instance State, Max Stack обычно = 1. - На префаб мира (
World Drop Prefab) добавьте наследникаInventoryItemStateBehaviour(илиMonoBehaviourсIInventoryItemState) и реализуйтеCaptureInventoryState/RestoreInventoryState. - При необходимости задайте уникальный ключ в инспекторе (поле Inventory State Key у базового behaviour); иначе ключ = полное имя типа.
- Подбор:
PickableItemпри сборе вызывает захват состояния с иерархии префаба (если предмет помечен как instance-based). - Выброс:
InventoryDropperспавнит префаб и восстанавливает состояние по сохранённому payload. - Сохранение: payload хранится внутри JSON контейнера (
InventorySaveData) по Save KeyInventoryComponent, отдельные ключи SaveProvider на каждый предмет не нужны.
- ScriptableObject: создай
Inventory Item Data(меню Neoxider → Tools → Inventory), задай Item Id, включи Supports Instance State, Max Stack =1(или другое осмысленное для нестакаемого экземпляра), назначь World Drop Prefab — префаб объекта в мире. - Префаб мира: на корне (или дочерних объектах) повесь PickableItem (
Item Dataили тот же id), настрой подбор (триггер /Collect). - Состояние: на том же префабе добавь свой класс от InventoryItemStateBehaviour (или
MonoBehaviour+IInventoryItemState) и реализуйCaptureInventoryState/RestoreInventoryState(обычноJsonUtilityили свой формат строки). - База: добавь этот
InventoryItemDataв Inventory Database, чтобы лимиты стака и lookup работали. - Игра: положи префаб в сцену или выдай предмет кодом (
AddItemData/AddItemInstance); при сохранении контейнера состояние уйдёт в общий blob по Save Key.
Ниже — пример «пистолет с патронами» и таблица API.
| Член | Описание |
|---|---|
| InventoryStateKey | Строковый ключ; должен совпадать при capture и restore. |
| CaptureInventoryState() | Вернуть JSON (или другую сериализуемую строку). |
| RestoreInventoryState(string json) | Применить сохранённую строку к объекту в мире / в руке. |
Абстрактный MonoBehaviour: задаёт ключ по умолчанию и требует реализовать capture/restore. Удобно для No-Code привязки в инспекторе.
| Метод | Описание |
|---|---|
| HasState(GameObject root) | Есть ли на иерархии реализации интерфейса. |
| CaptureInstance(root, itemId, count) | Собрать все компоненты состояния в новый InventoryItemInstance. |
| RestoreInstance(root, instance) | Раздать JSON по компонентам с совпадающим ключом. |
Настройка данных:
InventoryItemData«Pistol»: Supports Instance State = да, Max Stack = 1, World Drop Prefab = префаб пистолета в мире.
Настройка префаба:
- На префабе скрипт-наследник
InventoryItemStateBehaviour. - В
CaptureInventoryStateсериализуйте поля (напримерJsonUtility.ToJson(new Data { Mag = _ammo })). - В
RestoreInventoryState— десериализация и применение к полям / UI.
Инвентарь:
- Контейнер игрока:
InventoryComponent, Slot Grid или Aggregated, уникальный Save Key. - После
Load()патроны и апгрейды восстанавливаются из того же blob, что и слоты.
- InventoryComponent — раздел instance-based
- PickableItem
- InventoryDropper
- InventoryHand