diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs new file mode 100644 index 00000000..438a1247 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs @@ -0,0 +1,104 @@ +using System; +using UniRx; +using UniRx.Triggers; +using UnityEngine; +using UnityEngine.UI; + +public enum TankState +{ + Unavailable, + Lock, + Unlock, + Selected, +} +public class ProductManagementTankView : MonoBehaviour +{ + [SerializeField] private GameObject selectedIndicateObject; + [SerializeField] private GameObject tankObject; + [SerializeField] private Image popcornImage; + [SerializeField] private Image packageImage; + [SerializeField] private Text tankNumber; + [SerializeField] private Text tankStock; + private string tankStockFormat = "{0}/{1} 個"; + private string tankEmptyText = "空っぽ"; + [SerializeField] private TankRarityView rarityView; + [SerializeField] private Button detailButton; + [SerializeField] private GameObject arrow; + // 未購入 + [SerializeField] private GameObject lockedTankObject; + [SerializeField] private Text lockedTankNumber; + [SerializeField] private Text price; + [SerializeField] private Button purchaseButton; + private int tankNumberInt; + private readonly BoolReactiveProperty isEmply = new BoolReactiveProperty(); + private readonly BoolReactiveProperty detailButtonActive = new BoolReactiveProperty(); + public int TankNumber => tankNumberInt; + + private readonly ReactiveProperty state = new ReactiveProperty(); + public IReadOnlyReactiveProperty State => state; + public IObservable DetailButtonObservable => detailButton.OnClickAsObservable().TakeUntilDestroy(this); + public IObservable PurchaseButtonObservable => purchaseButton.OnClickAsObservable().TakeUntilDestroy(this); + public IObservable TankClickObservable { get; private set; } + + + private void Awake() + { + var eventTrigger = gameObject.AddComponent(); + TankClickObservable = eventTrigger.OnPointerClickAsObservable().TakeUntilDestroy(this).AsUnitObservable(); + } + + private void Start() + { + isEmply.AddTo(this); + detailButtonActive.AddTo(this); + state.Subscribe(x => + { + tankObject.SetActive(x != TankState.Lock && x != TankState.Unavailable); + lockedTankObject.SetActive(x == TankState.Lock || x == TankState.Unavailable); + purchaseButton.gameObject.SetActive(x == TankState.Lock); + selectedIndicateObject.SetActive(x == TankState.Selected); + }).AddTo(this); + isEmply.Subscribe(active => + { + packageImage.gameObject.SetActive(!active); + popcornImage.gameObject.SetActive(!active); + rarityView.gameObject.SetActive(!active); + }).AddTo(this); + isEmply.CombineLatest(detailButtonActive, (b, b1) => !b && b1) + .Subscribe(active => + { + detailButton.gameObject.SetActive(active); + }).AddTo(this); + } + + public void Initialize(int number, int tankPrice) + { + state.Value = TankState.Unavailable; + tankNumberInt = number; + tankNumber.text = $"{number}"; + lockedTankNumber.text = $"{number}"; + price.text = $"{tankPrice}"; + } + + public void SetData(StorageTank tank) + { + isEmply.Value = tank.Stock == 0; + tankStock.text = isEmply.Value ? tankEmptyText : String.Format(tankStockFormat, tank.Stock, tank.Capacity); + rarityView.SetHasRarity(tank.Stocks); + } + + public void SetState(TankState tankState) + { + state.Value = tankState; + } + + public void SetArrow(bool active) + { + arrow.SetActive(active); + } + + public void SetDetailButtonActive(bool active) + { + detailButtonActive.Value = active; + } +} diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs.meta b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs.meta new file mode 100644 index 00000000..4ba96b78 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementTankView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cb86ab823f03425b97e7c977c5e65267 +timeCreated: 1631500410 \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementView.cs new file mode 100644 index 00000000..5f81b388 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementView.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using UniRx; +using UnityEngine; +using UnityEngine.UI; + +public enum ProductRefillMode +{ + OneByOne, + TankByTank, +} +public class ProductManagementView : MonoBehaviour +{ + [SerializeField] private List tankList = new List(); + [SerializeField] private GameObject oneByOneOn; + [SerializeField] private GameObject tankByTankOn; + [SerializeField] private Button oneByOneOff; + [SerializeField] private Button tankByTankOff; + + public ReactiveProperty RefillType => refillType; + private readonly ReactiveProperty refillType = new ReactiveProperty(); + private void Start() + { + refillType.AddTo(this); + oneByOneOff.OnClickAsObservable().Select(_ => ProductRefillMode.OneByOne) + .Merge(tankByTankOff.OnClickAsObservable().Select(_ => ProductRefillMode.TankByTank)) + .Subscribe(type => + { + refillType.Value = type; + }).AddTo(this); + refillType.Subscribe(type => + { + oneByOneOn.SetActive(type == ProductRefillMode.OneByOne); + oneByOneOff.gameObject.SetActive(type != ProductRefillMode.OneByOne); + tankByTankOn.SetActive(type == ProductRefillMode.TankByTank); + tankByTankOff.gameObject.SetActive(type != ProductRefillMode.TankByTank); + }).AddTo(this); + } + + public List SetTanks(List priceList) + { + var i = 1; + foreach (var tankView in tankList) + { + tankView.Initialize(i, priceList[i - 1]); + i++; + } + return tankList; + } + + public void SetRefillType(ProductRefillMode mode) + { + refillType.Value = mode; + } +} diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementView.cs.meta b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementView.cs.meta new file mode 100644 index 00000000..01fc5f51 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/ProductManagementView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6fb8a3338e924cbe9255939ad1ab6017 +timeCreated: 1631500384 \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RarityStockView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RarityStockView.cs new file mode 100644 index 00000000..afc3aa9e --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RarityStockView.cs @@ -0,0 +1,15 @@ +using UnityEngine; +using UnityEngine.UI; + +public class RarityStockView : MonoBehaviour +{ + private static readonly string textFormat = "{0}×{1}個"; + [SerializeField] private Text normalText; + [SerializeField] private ProductRarity rarity; + public ProductRarity Rarity => rarity; + + public void SetText(int price, int stock) + { + normalText.text = string.Format(textFormat, price, stock); + } +} diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RarityStockView.cs.meta b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RarityStockView.cs.meta new file mode 100644 index 00000000..a9919ff3 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RarityStockView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b0dc9cb18f7548c6a51cf39c843c54ef +timeCreated: 1631684472 \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RaritySummaryView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RaritySummaryView.cs new file mode 100644 index 00000000..fba0c332 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RaritySummaryView.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.UI; + +public class RaritySummaryView : MonoBehaviour +{ + [SerializeField] private List rarityStockViews; + + public void SetHasRarity(List<(ProductRarity rarity, int price, int stock)> dataList) + { + foreach (var data in dataList) + { + rarityStockViews.First(x => x.Rarity == data.rarity)?.SetText(data.price, data.stock); + } + } +} \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RaritySummaryView.cs.meta b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RaritySummaryView.cs.meta new file mode 100644 index 00000000..aacb05ed --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/RaritySummaryView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 756a75c73f084205b9473c046ff47a94 +timeCreated: 1631632399 \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankDetailView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankDetailView.cs new file mode 100644 index 00000000..8f868bed --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankDetailView.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using UniRx; +using UnityEngine; +using UnityEngine.UI; + +public class TankDetailView : MonoBehaviour +{ + public static readonly string TankDetailDataTag = "TankDetailData"; + private static readonly int OpenTrigger = Animator.StringToHash("OpenTrigger"); + private static readonly int CloseTrigger = Animator.StringToHash("CloseTrigger"); + private static readonly string totalStockFormat = "所持数:{0}"; + private static readonly string tankStockFormat = "タンク{0}:{1}"; + + [SerializeField] private Animator backgroundAnimator; + [SerializeField] private Text tankNumber; + [SerializeField] private Text totalStock; + [SerializeField] private Text tankStock; + [SerializeField] private Text price; + [SerializeField] private Text name; + [SerializeField] private Text text; + [SerializeField] private Image popcornImage; + [SerializeField] private RaritySummaryView raritySummaryView; + [SerializeField] private Button closeButton; + + private void Start() + { + var data = LocalCacheManager.Load<(int tankNum, int totalStock, StorageTank tankData, RecipeData recipeData, List<(ProductRarity rarity, int price, int stock)> raritySummaryData)>(TankDetailDataTag); + closeButton.OnClickAsObservable().Subscribe(_ => + { + transform.SetLocalScale(0); + backgroundAnimator.SetTrigger(CloseTrigger); + this.CallWaitForSeconds(.25f, () => + { + TransitionManager.Instance.UnloadScene(GameScenes.PopcornDescription); + }); + }).AddTo(this); + + tankNumber.text = $"{data.tankNum}"; + totalStock.text = string.Format(totalStockFormat, data.totalStock); + tankStock.text = string.Format(tankStockFormat, data.tankNum, data.tankData.Stock); + price.text = $"{data.recipeData.Price}"; + name.text = $"{data.recipeData.Name}"; + text.text = $""; + raritySummaryView.SetHasRarity(data.raritySummaryData); + } +} diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankDetailView.cs.meta b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankDetailView.cs.meta new file mode 100644 index 00000000..e537e679 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankDetailView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 503f73b9937449a58919451f7b823757 +timeCreated: 1631631272 \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankRarityView.cs b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankRarityView.cs new file mode 100644 index 00000000..39a36fbc --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankRarityView.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +public class TankRarityView : MonoBehaviour +{ + [SerializeField] private GameObject normalOn; + [SerializeField] private GameObject normalOff; + [SerializeField] private GameObject yellowOn; + [SerializeField] private GameObject yellowOff; + [SerializeField] private GameObject copperOn; + [SerializeField] private GameObject copperOff; + [SerializeField] private GameObject silverOn; + [SerializeField] private GameObject silverOff; + [SerializeField] private GameObject goldOn; + [SerializeField] private GameObject goldOff; + [SerializeField] private GameObject rainbowOn; + [SerializeField] private GameObject rainbowOff; + + public void SetHasRarity(List stocks) + { + var rarities = stocks.Where(x => x.Stock > 0).Select(x => x.Rarity).ToList(); + normalOn.SetActive(rarities.Contains(ProductRarity.Normal)); + normalOff.SetActive(!rarities.Contains(ProductRarity.Normal)); + yellowOn.SetActive(rarities.Contains(ProductRarity.Yellow)); + yellowOff.SetActive(!rarities.Contains(ProductRarity.Yellow)); + copperOn.SetActive(rarities.Contains(ProductRarity.Copper)); + copperOff.SetActive(!rarities.Contains(ProductRarity.Copper)); + silverOn.SetActive(rarities.Contains(ProductRarity.Silver)); + silverOff.SetActive(!rarities.Contains(ProductRarity.Silver)); + goldOn.SetActive(rarities.Contains(ProductRarity.Gold)); + goldOff.SetActive(!rarities.Contains(ProductRarity.Gold)); + rainbowOn.SetActive(rarities.Contains(ProductRarity.Rainbow)); + rainbowOff.SetActive(!rarities.Contains(ProductRarity.Rainbow)); + } +} \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankRarityView.cs.meta b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankRarityView.cs.meta new file mode 100644 index 00000000..7db1dfc0 --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/marketing/Scripts/TankRarityView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bb57f12f265d434da0a003594c0d20d1 +timeCreated: 1631509426 \ No newline at end of file