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 _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 GetCheckoutList() { var list = new List(_rowByItemId.Values); list.Sort((a, b) => a.OrderNum.CompareTo(b.OrderNum)); return list; } } }