From ab39422dcd9d4ee6d100bf5c450724fba891014b Mon Sep 17 00:00:00 2001 From: kimura Date: Thu, 16 Sep 2021 11:45:03 +0900 Subject: [PATCH] =?UTF-8?q?=E8=B3=BC=E5=85=A5=E5=87=A6=E7=90=86=E5=AE=9F?= =?UTF-8?q?=E8=A3=85/=E4=B8=A6=E3=81=B3=E6=9B=BF=E3=81=88=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E6=96=B9=E6=B3=95=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/marketing/ProductManagement.unity | 31 ++++ .../marketing/Scripts/ProductManagement.cs | 172 ++++++++++++------ .../Scripts/ProductManagementTankView.cs | 5 + .../Scenes/marketing/Scripts/StorageTank.cs | 5 + .../Scenes/marketing/Scripts/TastingView.cs | 10 +- .../Assets/MyGame/Scripts/GameDataManager.cs | 2 - 6 files changed, 161 insertions(+), 64 deletions(-) diff --git a/popcorn/Assets/MyGame/Scenes/marketing/ProductManagement.unity b/popcorn/Assets/MyGame/Scenes/marketing/ProductManagement.unity index 77d41efa..ef1b14e2 100644 --- a/popcorn/Assets/MyGame/Scenes/marketing/ProductManagement.unity +++ b/popcorn/Assets/MyGame/Scenes/marketing/ProductManagement.unity @@ -680,6 +680,18 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 219610911} m_PrefabAsset: {fileID: 0} +--- !u!114 &219610916 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 3664916832512110619, guid: caaa748dbeed576499e8cae74d33f689, + type: 3} + m_PrefabInstance: {fileID: 219610911} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 351b4ffae35e149bf81549887561d561, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &493087540 GameObject: m_ObjectHideFlags: 0 @@ -984,6 +996,7 @@ GameObject: m_Component: - component: {fileID: 586451195} - component: {fileID: 586451196} + - component: {fileID: 586451197} m_Layer: 0 m_Name: Manager m_TagString: Untagged @@ -1019,6 +1032,24 @@ MonoBehaviour: m_EditorClassIdentifier: tastingButton: {fileID: 1280872481} view: {fileID: 639967259} +--- !u!114 &586451197 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 586451194} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 60b7ac089a534e549c0e25a89b113261, type: 3} + m_Name: + m_EditorClassIdentifier: + coinIconTransform: {fileID: 0} + coinCountText: {fileID: 219610916} + coinAnimator: {fileID: 0} + coinPrefab: {fileID: 0} + duration: 0.5 + rootTransform: {fileID: 0} --- !u!1 &613202084 GameObject: m_ObjectHideFlags: 0 diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagement.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagement.cs index 19c29fe1..226aaec4 100644 --- a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagement.cs +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagement.cs @@ -22,36 +22,12 @@ public class ProductManagement : MonoBehaviour state.AddTo(this); state.Value = ManagementState.None; var gameData = GameDataManager.GameData; - // CoinManager.Instance.ChangeCoin(gameData.coin); - - // タンクデータ読み込み - gameData.StorageTanks = new List - { - new StorageTank(){Id = 1, Capacity = 50, FlavorId = 1, Stocks = new List{new ProductStockData{Rarity = ProductRarity.Normal, Stock = 0}}}, - new StorageTank(){Id = 2, Capacity = 50, FlavorId = 1, Stocks = new List - { - new ProductStockData{Rarity = ProductRarity.Normal, Stock = 1}, - new ProductStockData{Rarity = ProductRarity.Yellow, Stock = 20}, - new ProductStockData{Rarity = ProductRarity.Copper, Stock = 1}, - new ProductStockData{Rarity = ProductRarity.Rainbow, Stock = 10}, - }}, - // new StorageTank(){Id = 3, Capacity = 50, FlavorId = 1, Stocks = new List{new ProductStockData{Rarity = ProductRarity.Yellow, Stock = 2}}}, - new StorageTank(){Id = 5, Capacity = 50, FlavorId = 1, Stocks = new List{new ProductStockData{Rarity = ProductRarity.Gold, Stock = 4}}}, - }; + CoinManager.Instance.ChangeCoin(gameData.coin); + HeartMeter.Instance.SetHeart(gameData.Heart); // 補充方法設定 view.SetRefillType(gameData.RefillMode); - // TankOrderを更新 - Debug.Log(gameData.TankOrder.Aggregate(new StringBuilder(), (builder, i) => builder.Append(i)).ToString()); - if (gameData.TankOrder.Length != gameData.StorageTanks.Count) - { - var excepts = gameData.StorageTanks.Select(x => x.Id).Except(gameData.TankOrder); - Debug.Log(excepts.Aggregate("", (s, i) => $"{s},{i}")); - var tmpTankOrder = gameData.TankOrder.ToList(); - tmpTankOrder.AddRange(excepts); - gameData.TankOrder = tmpTankOrder.ToArray(); - Debug.Log(gameData.TankOrder.Aggregate("", (s, i) => $"{s},{i}")); - } + // tank price list var priceList = new List { @@ -63,6 +39,25 @@ public class ProductManagement : MonoBehaviour 2000, 2500, }; + // タンクデータ読み込み + gameData.StorageTanks = new List + { + new StorageTank(){Id = 1, Capacity = 50, FlavorId = 1, Stocks = new List{new ProductStockData{Rarity = ProductRarity.Normal, Stock = 0}}}, + new StorageTank(){Id = 2, Capacity = 50, FlavorId = 2, Stocks = new List + { + new ProductStockData{Rarity = ProductRarity.Normal, Stock = 1}, + new ProductStockData{Rarity = ProductRarity.Yellow, Stock = 20}, + }}, + new StorageTank(){Id = 3, Capacity = 50, FlavorId = 1, Stocks = new List + { + new ProductStockData{Rarity = ProductRarity.Copper, Stock = 1}, + new ProductStockData{Rarity = ProductRarity.Silver, Stock = 5}, + new ProductStockData{Rarity = ProductRarity.Gold, Stock = 10}, + new ProductStockData{Rarity = ProductRarity.Rainbow, Stock = 20}, + }}, + new StorageTank(){Id = 4, Capacity = 50, FlavorId = 1, Stocks = new List{new ProductStockData{Rarity = ProductRarity.Gold, Stock = 4}}}, + }; + // タンク設定 var tankList = view.SetTanks(priceList); var rarityDataList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.RarityDataSheet); @@ -71,60 +66,104 @@ public class ProductManagement : MonoBehaviour tankView.SetArrow(tankView.TankNumber != 4 && tankView.TankNumber != 7 && tankView.TankNumber != gameData.StorageTanks.Count); if (tankView.TankNumber > gameData.StorageTanks.Count) { - tankView.SetState(TankState.Lock); + // 価格の一番小さいタンクのみ購入できるようにする + if (tankView.TankNumber == gameData.StorageTanks.Count + 1) + { + tankView.SetState(TankState.Lock); + } + else + { + tankView.SetState(TankState.Unavailable); + } // タンク購入 + var shopData = new ShopData + { + nameId = 0, + name = "タンク", + price = priceList[tankView.TankNumber - 1], + text = "ポップコーンを保存する容器", + category = 3, + consumeType = 2, + prefabName = "" + }; tankView.PurchaseButtonObservable + .Where(_ => shopData.price <= CoinManager.Instance.OwnCoin) .TakeWhile(_ => tankView.State.Value == TankState.Lock || tankView.State.Value == TankState.Unavailable) .Subscribe(_ => { - var price = priceList[tankView.TankNumber - 1]; - // 購入処理 - // タンク追加&Order追加 - tankView.SetData(gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankView.TankNumber - 1])); + Action purchaseAction = amount => + { + // タンク追加 + gameData.StorageTanks.Add(new StorageTank() {Id = tankView.TankNumber, Capacity = 50}); + tankView.SetData(gameData.StorageTanks[tankView.TankNumber - 1]); + tankView.SetState(TankState.Unlock); + CoinManager.Instance.SubCoin(shopData.price); + gameData.coin = CoinManager.Instance.OwnCoin; + GameDataManager.SaveGameData(); + // 次に大きいタンクの購入ボタンを表示 + if (tankView.TankNumber + 1 <= tankList.Count) + { + tankList[tankView.TankNumber].SetState(TankState.Lock); + } + }; + LocalCacheManager.Save(ShopItemPurchaseView.ItemPurchaseTag, (shopData, 0, purchaseAction)); + TransitionManager.Instance.LoadSceneAdditive(GameScenes.Purchase); }).AddTo(tankView); } else { - var tankData = gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankView.TankNumber - 1]); - tankView.SetData(tankData); + tankView.SetData(gameData.StorageTanks[tankView.TankNumber - 1]); tankView.SetState(TankState.Unlock); + } + tankView.DetailButtonObservable.Subscribe(_ => + { + state.Value = ManagementState.None; + var tankData = gameData.StorageTanks[tankView.TankNumber - 1]; var totalStock = gameData.ShopStock.Sum(x => x) + gameData.StorageTanks.Where(x => x.FlavorId == tankData.FlavorId).Sum(x => x.Stock); var recipe = RecipeData.GetRecipe(tankData.FlavorId); var price = recipe?.Price ?? 0; List<(ProductRarity rarity, int price, int stock)> raritySummaryData = rarityDataList.Select(x => (x.Rarity, price * x.rate / 100, tankData.Stocks.FirstOrDefault(sd => sd.Rarity == x.Rarity)?.Stock ?? 0) ).ToList(); - tankView.DetailButtonObservable.Subscribe(_ => - { - state.Value = ManagementState.None; - LocalCacheManager.Save(TankDetailView.TankDetailDataTag, (tankView.TankNumber, totalStock, tankData, recipe, raritySummaryData)); - TransitionManager.Instance.LoadSceneAdditive(GameScenes.PopcornDescription); - }).AddTo(tankView); - } + LocalCacheManager.Save(TankDetailView.TankDetailDataTag, (tankView.TankNumber, totalStock, tankData, recipe, raritySummaryData)); + TransitionManager.Instance.LoadSceneAdditive(GameScenes.PopcornDescription); + }).AddTo(tankView); state.Subscribe(x => { tankView.SetDetailButtonActive(x != ManagementState.Tasting); }).AddTo(tankView); } - var selectedTankSubject = new Subject<(int num, RecipeData recipe)>().AddTo(this); - var selectedTankObservable = selectedTankSubject.AsObservable(); + var selectedTank = new ReactiveProperty<(int num, RecipeData recipe)>().AddTo(this); state.Subscribe(mState => { switch (mState) { case ManagementState.None: + ChangeAllTankInteractable(tankList, true); ClearSelectedTank(tankList); break; case ManagementState.Replacing: break; case ManagementState.Tasting: - // 1番目選択 + // 空以外のタンクを選択 + var index = gameData.StorageTanks.FindIndex(tank => tank.Stock > 0); + if (index == -1) + { + state.Value = ManagementState.None; + return; + } + ChangeAllTankInteractable(tankList, false); ClearSelectedTank(tankList); - tankList[0].SetState(TankState.Selected); - var tankData = gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankList[0].TankNumber - 1]); - selectedTankSubject.OnNext((1, RecipeData.GetRecipe(tankData.FlavorId))); - LocalCacheManager.Save(TastingView.TastingDataTag, (selectedTankObservable, new Action(() => state.Value = ManagementState.None), new Action(Tasting))); + tankList[index].SetState(TankState.Selected); + var tankData = gameData.StorageTanks[index]; + selectedTank.Value = (tankList[index].TankNumber, RecipeData.GetRecipe(tankData.FlavorId)); + Action tastingAction = () => + { + Tasting(selectedTank.Value.num); + tankList[selectedTank.Value.num - 1].SetData(gameData.StorageTanks[selectedTank.Value.num - 1]); + }; + LocalCacheManager.Save(TastingView.TastingDataTag, (selectedTank.AsObservable(), new Action(() => state.Value = ManagementState.None), tastingAction)); TransitionManager.Instance.LoadSceneAdditive(GameScenes.Tasting); break; default: @@ -148,10 +187,14 @@ public class ProductManagement : MonoBehaviour case ManagementState.Replacing: break; case ManagementState.Tasting: + if (gameData.StorageTanks[tankView.TankNumber - 1].Stock == 0) + { + return; + } ClearSelectedTank(tankList); tankView.SetState(TankState.Selected); - var tankData = gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankView.TankNumber - 1]); - selectedTankSubject.OnNext((tankView.TankNumber, RecipeData.GetRecipe(tankData.FlavorId))); + var tankData = gameData.StorageTanks[tankView.TankNumber - 1]; + selectedTank.Value = (tankView.TankNumber, RecipeData.GetRecipe(tankData.FlavorId)); break; default: throw new ArgumentOutOfRangeException(); @@ -172,12 +215,12 @@ public class ProductManagement : MonoBehaviour { if (tanks.Previous.TankNumber != tanks.Current.TankNumber) { - var tmpId = gameData.TankOrder[tanks.Previous.TankNumber - 1]; - gameData.TankOrder[tanks.Previous.TankNumber - 1] = gameData.TankOrder[tanks.Current.TankNumber - 1]; - gameData.TankOrder[tanks.Current.TankNumber - 1] = tmpId; + var tmpData = gameData.StorageTanks[tanks.Previous.TankNumber - 1]; + gameData.StorageTanks[tanks.Previous.TankNumber - 1] = gameData.StorageTanks[tanks.Current.TankNumber - 1]; + gameData.StorageTanks[tanks.Current.TankNumber - 1] = tmpData; // 再設定 - tanks.Previous.SetData(gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tanks.Previous.TankNumber - 1])); - tanks.Current.SetData(gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tanks.Current.TankNumber - 1])); + tanks.Previous.SetData(gameData.StorageTanks[tanks.Previous.TankNumber - 1]); + tanks.Current.SetData(gameData.StorageTanks[tanks.Current.TankNumber - 1]); GameDataManager.SaveGameData(); } state.Value = ManagementState.None; @@ -190,7 +233,10 @@ public class ProductManagement : MonoBehaviour view.RefillType.Subscribe(mode => { - state.Value = ManagementState.None; + if (state.Value != ManagementState.Tasting) + { + state.Value = ManagementState.None; + } // 補充方法変更 gameData.RefillMode = mode; GameDataManager.SaveGameData(); @@ -208,9 +254,21 @@ public class ProductManagement : MonoBehaviour } } + private void ChangeAllTankInteractable(List tankList, bool active) + { + foreach (var tankView in tankList) + { + if (tankView.State.Value == TankState.Lock) + { + tankView.SetPurchaseButtonActive(active); + } + } + } + private void Tasting(int tankNumber) { state.Value = ManagementState.None; - Debug.Log($"tasting:{tankNumber}"); + GameDataManager.GameData.StorageTanks[tankNumber - 1].ClearStock(); + // 試食フラグに終了時間を設定 } } diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs index 438a1247..2192b34d 100644 --- a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs @@ -101,4 +101,9 @@ public class ProductManagementTankView : MonoBehaviour { detailButtonActive.Value = active; } + + public void SetPurchaseButtonActive(bool active) + { + purchaseButton.interactable = active; + } } diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/StorageTank.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/StorageTank.cs index a2fa07a6..bb4df447 100644 --- a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/StorageTank.cs +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/StorageTank.cs @@ -30,6 +30,11 @@ public class StorageTank } stockData.Stock += stock; } + + public void ClearStock() + { + Stocks.Clear(); + } } public class ProductStockData diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TastingView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TastingView.cs index 4c485435..3ca5249e 100644 --- a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TastingView.cs +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TastingView.cs @@ -18,7 +18,7 @@ public class TastingView : MonoBehaviour private void Start() { - var data = LocalCacheManager.Load<(IObservable<(int tankNum, RecipeData recipe)> selectedObservable, Action closeButtonAction, Action tastingButtonAction)>(TastingDataTag); + var data = LocalCacheManager.Load<(IObservable<(int tankNum, RecipeData recipe)> selectedObservable, Action closeButtonAction, Action tastingButtonAction)>(TastingDataTag); data.selectedObservable.Subscribe(x => { popcornName.text = x.recipe.Name; @@ -26,18 +26,18 @@ public class TastingView : MonoBehaviour closeButton.OnClickAsObservable().Subscribe(_ => { backgroundAnimator.SetTrigger(CloseTrigger); - this.CallWaitForSeconds(.25f, () => + this.CallWaitForSeconds(.5f, () => { data.closeButtonAction?.Invoke(); TransitionManager.Instance.UnloadScene(GameScenes.Tasting); }); }).AddTo(this); - tastingButton.OnClickAsObservable().WithLatestFrom(data.selectedObservable, (_, x) => x.tankNum).Subscribe(tankNum => + tastingButton.OnClickAsObservable().Subscribe(_ => { backgroundAnimator.SetTrigger(CloseTrigger); - this.CallWaitForSeconds(.25f, () => + this.CallWaitForSeconds(.5f, () => { - data.tastingButtonAction?.Invoke(tankNum); + data.tastingButtonAction?.Invoke(); TransitionManager.Instance.UnloadScene(GameScenes.Tasting); }); }).AddTo(this); diff --git a/popcorn/Assets/MyGame/Scripts/GameDataManager.cs b/popcorn/Assets/MyGame/Scripts/GameDataManager.cs index abf417f6..7b59f3f3 100644 --- a/popcorn/Assets/MyGame/Scripts/GameDataManager.cs +++ b/popcorn/Assets/MyGame/Scripts/GameDataManager.cs @@ -80,7 +80,6 @@ public sealed class GameData { [DataMember(Name = "Data22")] public int[] Pans; // [DataMember(Name = "Data23")] - public int[] TankOrder; [DataMember(Name = "Data24")] public ProductRefillMode RefillMode; // [DataMember(Name = "Data25")] @@ -124,7 +123,6 @@ public sealed class GameData { // lastAdRewardTimeList = lastAdRewardTimeArray == null ? new List() : lastAdRewardTimeArray.ToList(); ShopStock = shopStock?.ToList() ?? new List(); Pans = Pans ?? new int[0]; - TankOrder = TankOrder ?? new int[0]; } private Dictionary ArrayToDictionary(KeyValueOfintint[] array){ var dictionary = new Dictionary();