Что это: Shop — основной runtime-контроллер магазина. Он загружает цены и экипированный товар через SaveProvider, показывает превью, создаёт недостающие ShopItem, обрабатывает покупку через IMoneySpend и обновляет визуализацию. Файл: Scripts/Shop/Shop.cs, пространство имён: Neo.Shop.
Как использовать:
- Создать ассеты ShopItemData, назначить их в массив Shop Item Datas.
- На сцену добавить объект с компонентом Shop; привязать Shop Item Preview и массив Shop Items (или задать Prefab и Container для автозаполнения).
- В Money Spend Source указать объект с IMoneySpend (например Money); если пусто — используется
Money.I. - Вызовы:
Buy()/Buy(id)для покупки,Select(id)через свойствоIdили события.
- Загружает стартовые цены из
ShopItemData[]или из сохранения. - Восстанавливает последний экипированный товар по
_keySaveEquipped. - Может автоматически создать недостающие
ShopItemиз_prefab. - Подписывает кнопки покупки у элементов магазина, если включён
_autoSubscribe. - Покупает товар через
IMoneySpend. - Для одноразовых покупок может обнулить цену после покупки.
- Обновляет превью и визуал всех элементов.
| Свойство | Описание |
|---|---|
Prices |
Текущий массив цен. |
ShopItemDatas |
Ассеты данных товаров. |
PreviewId |
ID товара в превью. |
Id |
ID текущего выбранного товара. Установка вызывает Select(). |
Shop Item Datas— данные товаров.Shop Item Preview— отдельный элемент для показа текущего превью.Shop Items— готовые runtime-элементы магазина.Use Set Item— визуально выделять выбранный товар черезShopItem.Select().Auto Subscribe— автоматически подписывать кнопкиbuttonBuy.Activate Saved Equipped— активировать последний сохранённый товар после загрузки.Key Save— префикс ключей сохранения цен.Key Save Equipped— ключ сохранения выбранного товара.Change Preview On Purchase Failed— переключать ли превью на товар при неудачной покупке.Container/Prefab— используются для автоспавнаShopItem.moneySpendSource— объект сIMoneySpend; если не задан, используетсяMoney.I.
| Метод | Описание |
|---|---|
ShowPreview(int id) |
Показывает товар в превью без покупки. |
Buy() |
Покупает текущий товар из превью. |
Buy(int id) |
Покупает товар по id. |
Visual() |
Перерисовывает все ShopItem. |
OnSelect— выбор товара.OnPurchased— успешная покупка.OnPurchaseFailed— неудачная покупка.OnLoad— завершение загрузки магазина.
Компонент не привязан напрямую к PlayerPrefs.
Текущая версия использует SaveProvider:
- цены читаются через
SaveProvider.GetInt(_keySave + i, defaultValue); - изменённые цены сохраняются через
SaveProvider.SetInt(...); - выбранный товар сохраняется через
SaveProvider.SetInt(_keySaveEquipped, _id).
Shop.Save() не вызывает SaveProvider.Save() вручную, а только обновляет значения в активном provider backend.
- Если цена товара уже
0, компонент просто выбирает его без списания денег. - Если покупка успешна и у
ShopItemData.isSinglePurchase == true, цена товара становится0. - Если денег недостаточно, вызывается
OnPurchaseFailed. - При включённом
_changePreviewOnPurchaseFailedпревью переключится на товар, который не удалось купить.