Назначение: опциональный bridge-компонент, связывающий Shop и InventoryComponent. Слушает Shop.OnPurchasedId(itemId) и на каждом срабатывании ищет совпадение в таблице Mappings. При совпадении вызывает InventoryComponent.AddItemData(...) и поднимает OnGranted(data, amount).
Доступно с 8.5.0.
Поля _inventoryItem / _inventoryAmount прямо на ShopItemData создали бы asmdef-цикл Neo.Shop → Neo.Tools.Inventory → Neo.Tools.View → Neo.Tools.Components → Neo.Shop. Bridge инвертирует направление — Neo.Tools.Inventory ссылается на Neo.Shop, и цикл уходит. Для пользователя это не приносит неудобства: bridge остаётся NoCode-дружественным.
- На той же GameObject, где находится
Shop(или на дочернем), добавьте компонентShop Inventory Grant Bridge(Add Component > Neoxider > Tools/Inventory > ShopInventoryGrantBridge). - Заполните
_shop(необязательно — bridge ищет Shop в родителях вAwake). - Заполните
_inventoryили включите_useInventorySingletonдля использованияInventoryComponent.Instance. - Добавьте записи в
Mappings:Shop Item Id— стабильныйShopItemData.Id.Inventory Item— соответствующийInventoryItemData.Amount— сколько выдавать за одну покупку (≥ 1).
При покупке любого ShopItemData (напрямую через Shop.Buy(...) или через BuyBundle(...), который для каждого вложенного предмета поднимает OnPurchasedId(item.Id)) bridge просматривает свои mappings и грантит инвентарю.
| Поле | Описание |
|---|---|
_shop |
Источник событий. Если null — ищется через GetComponentInParent<Shop>() в Awake. |
_inventory |
Целевой инвентарь. Если null и _useInventorySingleton == true, используется InventoryComponent.Instance. |
_useInventorySingleton |
Fallback на singleton, когда _inventory null. |
_mappings |
Список { Shop Item Id, Inventory Item, Amount }. |
OnGranted |
UnityEvent с аргументами (InventoryItemData, int amountAdded). |
ShopInventoryGrantBridge bridge = ...;
bridge.SetShop(shop); // программно сменить источник
bridge.SetInventory(inventory); // программно сменить инвентарь
bridge.GrantForShopItemId("sword_basic"); // ручной грант по id (NoCode-friendly UnityEvent target)
bridge.GrantDirect(inventoryItemData, 3); // напрямую — для DLC / кодовых паттернов
// Mappings можно править в рантайме
bridge.Mappings.Add(new ShopInventoryGrantBridge.GrantMapping {
ShopItemId = "season_pass_reward",
InventoryItem = chest,
Amount = 1
});