商品管理View追加

This commit is contained in:
kimura 2021-09-15 16:43:35 +09:00
parent 55d4f541f5
commit 3099d51483
12 changed files with 293 additions and 0 deletions

View File

@ -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<TankState> state = new ReactiveProperty<TankState>();
public IReadOnlyReactiveProperty<TankState> State => state;
public IObservable<Unit> DetailButtonObservable => detailButton.OnClickAsObservable().TakeUntilDestroy(this);
public IObservable<Unit> PurchaseButtonObservable => purchaseButton.OnClickAsObservable().TakeUntilDestroy(this);
public IObservable<Unit> TankClickObservable { get; private set; }
private void Awake()
{
var eventTrigger = gameObject.AddComponent<ObservableEventTrigger>();
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;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cb86ab823f03425b97e7c977c5e65267
timeCreated: 1631500410

View File

@ -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<ProductManagementTankView> tankList = new List<ProductManagementTankView>();
[SerializeField] private GameObject oneByOneOn;
[SerializeField] private GameObject tankByTankOn;
[SerializeField] private Button oneByOneOff;
[SerializeField] private Button tankByTankOff;
public ReactiveProperty<ProductRefillMode> RefillType => refillType;
private readonly ReactiveProperty<ProductRefillMode> refillType = new ReactiveProperty<ProductRefillMode>();
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<ProductManagementTankView> SetTanks(List<int> 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;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6fb8a3338e924cbe9255939ad1ab6017
timeCreated: 1631500384

View File

@ -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);
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b0dc9cb18f7548c6a51cf39c843c54ef
timeCreated: 1631684472

View File

@ -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<RarityStockView> 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);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 756a75c73f084205b9473c046ff47a94
timeCreated: 1631632399

View File

@ -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);
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 503f73b9937449a58919451f7b823757
timeCreated: 1631631272

View File

@ -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<ProductStockData> 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));
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: bb57f12f265d434da0a003594c0d20d1
timeCreated: 1631509426