diff --git a/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/PurchaseView.prefab b/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/PurchaseView.prefab index 086e705d..882adf81 100644 --- a/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/PurchaseView.prefab +++ b/popcorn/Assets/MyGame/Scenes/shopping/Prefabs/PurchaseView.prefab @@ -1,5 +1,154 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2895484395707725730 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1272573749203266507} + - component: {fileID: 4707019036817275407} + - component: {fileID: 5887917383623105892} + m_Layer: 5 + m_Name: Image_text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1272573749203266507 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2895484395707725730} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 7070062469376303877} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 2.9, y: 4} + m_SizeDelta: {x: 66, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4707019036817275407 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2895484395707725730} + m_CullTransparentMesh: 0 +--- !u!114 &5887917383623105892 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2895484395707725730} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 1ed7a6eade5a3af4c962706dec098104, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7845949066005219734 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7070062469376303877} + - component: {fileID: 1561612110923996906} + - component: {fileID: 7043889385648676325} + m_Layer: 5 + m_Name: Button_Purchase_Off + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &7070062469376303877 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7845949066005219734} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1272573749203266507} + m_Father: {fileID: 9133304336500199661} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 140, y: 125.10004} + m_SizeDelta: {x: 240, y: 98} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1561612110923996906 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7845949066005219734} + m_CullTransparentMesh: 0 +--- !u!114 &7043889385648676325 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7845949066005219734} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 8539f0168ede4654dbdbe738754bdb2f, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &9133304335139982201 GameObject: m_ObjectHideFlags: 0 @@ -134,7 +283,8 @@ MonoBehaviour: subCountButton: {fileID: 5919954079663981596} addCountButton: {fileID: 5919954079471528431} closeButton: {fileID: 9133304335940276437} - purchaseButton: {fileID: 9133304335268316946} + purchaseOnButton: {fileID: 9133304335268316946} + purchaseOffButton: {fileID: 7845949066005219734} --- !u!1 &9133304335268316944 GameObject: m_ObjectHideFlags: 0 @@ -148,7 +298,7 @@ GameObject: - component: {fileID: 9133304335268316949} - component: {fileID: 9133304335268316946} m_Layer: 5 - m_Name: Button_Purchase + m_Name: Button_Purchase_On m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -569,7 +719,7 @@ RectTransform: - {fileID: 9133304336181127573} - {fileID: 9133304337054428178} m_Father: {fileID: 9133304336500199661} - m_RootOrder: 4 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1597,6 +1747,7 @@ RectTransform: m_Children: - {fileID: 9133304335940276434} - {fileID: 9133304335268316947} + - {fileID: 7070062469376303877} - {fileID: 9133304337032816943} - {fileID: 9133304336675516546} - {fileID: 9133304335380453066} @@ -1899,7 +2050,7 @@ RectTransform: - {fileID: 9133304335893567655} - {fileID: 9133304335334808081} m_Father: {fileID: 9133304336500199661} - m_RootOrder: 3 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} @@ -2166,7 +2317,7 @@ RectTransform: - {fileID: 9133304336883555446} - {fileID: 9133304336944246770} m_Father: {fileID: 9133304336500199661} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} diff --git a/popcorn/Assets/MyGame/Scenes/shopping/Scripts/ShopItemPurchaseView.cs b/popcorn/Assets/MyGame/Scenes/shopping/Scripts/ShopItemPurchaseView.cs index acafc70b..54366a58 100644 --- a/popcorn/Assets/MyGame/Scenes/shopping/Scripts/ShopItemPurchaseView.cs +++ b/popcorn/Assets/MyGame/Scenes/shopping/Scripts/ShopItemPurchaseView.cs @@ -21,16 +21,17 @@ public class ShopItemPurchaseView : MonoBehaviour [SerializeField] private Button subCountButton; [SerializeField] private Button addCountButton; [SerializeField] private Button closeButton; - [SerializeField] private Button purchaseButton; - - public IObservable PurchaseButtonObservable => purchaseButton.OnClickAsObservable().TakeUntilDestroy(this); + [SerializeField] private Button purchaseOnButton; + [SerializeField] private GameObject purchaseOffButton; + private Color defaultColor; private readonly IntReactiveProperty currentCount = new IntReactiveProperty(); private void Start() { currentCount.AddTo(this); - - var data = LocalCacheManager.Load<(ShopData shopData, int stockCount)>(ItemPurchaseTag); + defaultColor = totalPrice.color; + var data = LocalCacheManager.Load<(ShopData shopData, int stockCount, Action callback)>(ItemPurchaseTag); + LocalCacheManager.Remove(ItemPurchaseTag); SetData(data.shopData, data.stockCount); closeButton.OnClickAsObservable().Subscribe(_ => { @@ -41,8 +42,9 @@ public class ShopItemPurchaseView : MonoBehaviour TransitionManager.Instance.UnloadScene(GameScenes.Purchase); }); }).AddTo(this); - purchaseButton.OnClickAsObservable().Subscribe(_ => + purchaseOnButton.OnClickAsObservable().Subscribe(_ => { + data.callback.Invoke(currentCount.Value); transform.SetLocalScale(0); backgroundAnimator.SetTrigger(CloseTrigger); this.CallWaitForSeconds(.25f, () => @@ -54,16 +56,25 @@ public class ShopItemPurchaseView : MonoBehaviour currentCount.Value = MinPurchaseCount; currentCount.Subscribe(x => { + var total = data.shopData.price * x; + SetButtonActive(total <= CoinManager.Instance.OwnCoin); + totalPrice.color = total <= CoinManager.Instance.OwnCoin ? defaultColor : Color.red; + totalPrice.text = $"{total}"; purchaseCount.text = $"{x}"; - totalPrice.text = $"{data.shopData.price * x}"; }).AddTo(this); - addCountButton.OnClickAsObservable().Select(_ => 1) - .Merge(subCountButton.OnClickAsObservable().Select(_ => -1)) - .Subscribe(x => - { - currentCount.Value = Mathf.Clamp(currentCount.Value + x, MinPurchaseCount, MaxPurchaseCount); - - }).AddTo(this); + if (data.shopData.ConsumeType == ShopItemType.Consumable) + { + addCountButton.OnClickAsObservable().Select(_ => 1) + .Merge(subCountButton.OnClickAsObservable().Select(_ => -1)) + .Subscribe(x => + { + currentCount.Value = Mathf.Clamp(currentCount.Value + x, MinPurchaseCount, MaxPurchaseCount); + }).AddTo(this); + } + else + { + currentCount.Value = 1; + } } private void SetData(ShopData shopData, int count) @@ -72,4 +83,10 @@ public class ShopItemPurchaseView : MonoBehaviour price.text = $"{shopData.price}"; stockCount.text = $"所持数 :{count}"; } + + private void SetButtonActive(bool active) + { + purchaseOnButton.gameObject.SetActive(active); + purchaseOffButton.SetActive(!active); + } } diff --git a/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs b/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs index 9c3fdda1..aeecafa4 100644 --- a/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs +++ b/popcorn/Assets/MyGame/Scenes/shopping/Scripts/Shopping.cs @@ -27,19 +27,26 @@ public class Shopping : MonoBehaviour { itemView.SetItemActive(shopData.price <= ownCoin); }).AddTo(this); + var purchaseSubject = new Subject(); + purchaseSubject.AddTo(itemView); + purchaseSubject.Subscribe(amount => + { + // アイテムを増やす + AddItem(shopData, amount); + itemView.SetStockCount(GetItemAmount(shopData)); + CoinManager.Instance.SubCoin(shopData.price * amount); + gameData.coin = CoinManager.Instance.OwnCoin; + changeCoinSubject.OnNext(gameData.coin); + GameDataManager.SaveGameData(); + }).AddTo(itemView); // アイテム購入クリック購読 itemView.PurchaseButtonObservable .Where(_ => shopData.price <= CoinManager.Instance.OwnCoin) .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); + LocalCacheManager.Save(ShopItemPurchaseView.ItemPurchaseTag, (shopData, GetItemAmount(shopData), new Action(x => purchaseSubject.OnNext(x)))); + TransitionManager.Instance.LoadSceneAdditive(GameScenes.Purchase); + }).AddTo(itemView); } changeCoinSubject.OnNext(CoinManager.Instance.OwnCoin); } @@ -60,7 +67,7 @@ public class Shopping : MonoBehaviour } } - private void AddItem(ShopData shopData) + private void AddItem(ShopData shopData, int amount) { var gameData = GameDataManager.GameData; switch (shopData.Category) @@ -69,16 +76,14 @@ public class Shopping : MonoBehaviour var index = gameData.Material.FindIndex(x => x.Id == shopData.itemId); if (index == -1) { + index = gameData.Material.Count; gameData.Material.Add(new MaterialData { Id = shopData.itemId, - Amount = 1 + Amount = 0 }); } - else - { - gameData.Material[index].Amount++; - } + gameData.Material[index].Amount += amount; break; case ItemCategory.Recipe: if (!gameData.MyRecipes.Contains(shopData.itemId))