diff --git a/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/Window.prefab b/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/Window.prefab index 07cf05f1..39b8b986 100644 --- a/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/Window.prefab +++ b/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/Window.prefab @@ -405,7 +405,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4f77652346b24cc9b0d5da516979f736, type: 3} m_Name: m_EditorClassIdentifier: - scrollRect: {fileID: 0} + scrollRect: {fileID: 2912042418150409388} itemViewPrefab: {fileID: 8023342812979047025, guid: 907730abf7bed70469027e0e8aba6fd9, type: 3} headerView: {fileID: 2912042418274684488} diff --git a/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs b/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs index 1e23bf3d..7c5be5dd 100644 --- a/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs +++ b/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs @@ -1,13 +1,102 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; +using System.Linq; +using UniRx; using UnityEngine; public class Shopping : MonoBehaviour { + [SerializeField] private ShopListView listView; // Start is called before the first frame update void Start() { var gameData = GameDataManager.GameData; CoinManager.Instance.ChangeCoin(gameData.coin); + HeartMeter.Instance.SetHeart(gameData.Heart); + var changeCoinSubject = new Subject().AddTo(this); + + // 一覧データ + var shopDataList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopDataSheet); + foreach (var shopData in shopDataList) + { + var itemView = listView.AddItemView(shopData); + itemView.SetStockCount(GetItemAmount(shopData)); + // コインを監視して購入可能状態を切り替え + changeCoinSubject.Subscribe(ownCoin => + { + if (shopData.ConsumeType == ShopItemType.NonConsumable && GetItemAmount(shopData) > 0) + { + itemView.SetItemActive(false); + return; + } + itemView.SetItemActive(shopData.price < ownCoin); + }).AddTo(this); + // アイテム購入クリック購読 + itemView.PurchaseButtonObservable.Subscribe(_ => + { + // アイテムを増やす + AddItem(shopData); + itemView.SetStockCount(GetItemAmount(shopData)); + CoinManager.Instance.SubCoin(shopData.price); + gameData.coin = CoinManager.Instance.OwnCoin; + changeCoinSubject.OnNext(gameData.coin); + GameDataManager.SaveGameData(); + }).AddTo(itemView); + } + changeCoinSubject.OnNext(CoinManager.Instance.OwnCoin); + } + + private int GetItemAmount(ShopData shopData) + { + var gameData = GameDataManager.GameData; + switch (shopData.Category) + { + case ItemCategory.Material: + return gameData.Material.Find(data => data.Id == shopData.itemId)?.Amount ?? 0; + case ItemCategory.Recipe: + return gameData.MyRecipes.Contains(shopData.itemId) ? 1 : 0; + case ItemCategory.Pan: + return gameData.Pans.Contains(shopData.itemId) ? 1 : 0; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private void AddItem(ShopData shopData) + { + var gameData = GameDataManager.GameData; + switch (shopData.Category) + { + case ItemCategory.Material: + var index = gameData.Material.FindIndex(x => x.Id == shopData.itemId); + if (index == -1) + { + gameData.Material.Add(new MaterialData + { + Id = shopData.itemId, + Amount = 1 + }); + } + else + { + gameData.Material[index].Amount++; + } + break; + case ItemCategory.Recipe: + if (!gameData.MyRecipes.Contains(shopData.itemId)) + { + gameData.MyRecipes = new List(gameData.MyRecipes){shopData.itemId}.ToArray(); + } + break; + case ItemCategory.Pan: + if (!gameData.Pans.Contains(shopData.itemId)) + { + gameData.Pans = new List(gameData.Pans){shopData.itemId}.ToArray(); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } } } diff --git a/popcorn/Assets/MyGame/Scripts/CoinManager.cs b/popcorn/Assets/MyGame/Scripts/CoinManager.cs index 46f564c3..6dfc3cb9 100644 --- a/popcorn/Assets/MyGame/Scripts/CoinManager.cs +++ b/popcorn/Assets/MyGame/Scripts/CoinManager.cs @@ -67,4 +67,13 @@ public class CoinManager : SingletonMonoBehaviour callback.Invoke(); }); } + + public void SubCoin(int coin){ + ownCoin -= coin; + if(coinCountText.gameObject.activeInHierarchy){ + coinCountText.CountUpAnimation(coinTextFormat, ownCoin, duration); + }else{ + coinCountText.ChangeValue(coinTextFormat, ownCoin); + } + } }