Files
Shopping_UnityVR/Assets/02_Scripts/Shopping/CheckoutMachine.cs

92 lines
2.7 KiB
C#

using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using VRShopping.Items;
using VRShopping.Player;
using VRShopping.Shopping;
using VRShopping.UI;
namespace VRShopping.Interact
{
public class CheckoutMachine : MonoBehaviour
{
public int CheckoutSum { get; private set; }
[SerializeField] private Transform _rowContainer;
[SerializeField] private CheckoutProductionRow _rowPrefab;
private readonly Dictionary<string, CheckoutProductionRow> _rowByItemId = new();
private int _nextOrderNum = 1;
[SerializeField] private TMP_Text _checkoutSumField;
private void Start()
{
UpdateSumUI();
}
public void UpdateSumUI()
{
if (_checkoutSumField != null)
_checkoutSumField.text = CheckoutSum.ToString("N0");
}
public void AddCheckoutProduction(ItemData itemData)
{
if (itemData == null) return;
if (_rowByItemId.TryGetValue(itemData.ItemId, out CheckoutProductionRow row))
{
row.Bind(itemData, row.Quantity + 1);
}
else
{
row = Instantiate(_rowPrefab, _rowContainer);
row.gameObject.SetActive(false); // OnEnable 지연
row.Bind(itemData, 1);
row.SetOrderNum(_nextOrderNum++);
Canvas.ForceUpdateCanvases();
LayoutRebuilder.ForceRebuildLayoutImmediate(_rowContainer as RectTransform);
row.gameObject.SetActive(true); // 바운드 확정 후 OnEnable
row.OnAddClicked += AddCheckoutProduction;
row.OnRemoveClicked += RemoveCheckoutProduction;
_rowByItemId[itemData.ItemId] = row;
}
CheckoutSum += itemData.FinalPrice;
UpdateSumUI();
}
public void RemoveCheckoutProduction(ItemData itemData)
{
if (itemData == null) return;
if (!_rowByItemId.TryGetValue(itemData.ItemId, out CheckoutProductionRow row)) return;
CheckoutSum -= itemData.FinalPrice;
if (row.Quantity <= 1)
{
_rowByItemId.Remove(itemData.ItemId);
Destroy(row.gameObject);
}
else
{
row.Bind(itemData, row.Quantity - 1);
}
UpdateSumUI();
}
public List<CheckoutProductionRow> GetCheckoutList()
{
var list = new List<CheckoutProductionRow>(_rowByItemId.Values);
list.Sort((a, b) => a.OrderNum.CompareTo(b.OrderNum));
return list;
}
}
}