using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI; using Northbound.Data; namespace Northbound { /// /// 업그레이드 목록 팝업 UI 컨트롤러 /// public class UpgradeListPopup : MonoBehaviour { [Header("References")] [SerializeField] private Transform _contentParent; [SerializeField] private GameObject _listItemPrefab; [SerializeField] private TextMeshProUGUI _manaText; [SerializeField] private Button _closeButton; private PlayerUpgradeManager _playerUpgradeManager; private PlayerStats _playerStats; private List _listItems = new List(); private void Awake() { if (_closeButton != null) { _closeButton.onClick.AddListener(Close); } } private void Update() { // ESC 키로 닫기 if (Keyboard.current != null && Keyboard.current.escapeKey.wasPressedThisFrame) { Close(); } // 마나 텍스트 업데이트 UpdateManaDisplay(); } /// /// 팝업 초기화 /// public void Initialize(PlayerUpgradeManager upgradeManager, PlayerStats playerStats) { _playerUpgradeManager = upgradeManager; _playerStats = playerStats; RefreshList(); UpdateManaDisplay(); gameObject.SetActive(true); } /// /// 업그레이드 목록 갱신 /// public void RefreshList() { // 기존 아이템 제거 ClearList(); if (_playerUpgradeManager == null) return; var database = UpgradeDatabase.Instance; if (database == null) { Debug.LogWarning("[UpgradeListPopup] UpgradeDatabase를 찾을 수 없습니다."); return; } // 개인 업그레이드 목록 가져오기 var allUpgrades = database.GetPersonalUpgrades(); var ownedIds = _playerUpgradeManager.GetOwnedUpgradeIdSet(); foreach (var upgrade in allUpgrades) { if (upgrade == null) continue; bool isOwned = ownedIds.Contains(upgrade.id); bool prerequisitesMet = database.ArePrerequisitesMet(upgrade.id, ownedIds); // 이미 구매했거나, 선행조건이 충족된 항목만 표시 if (!isOwned && !prerequisitesMet) continue; bool canPurchase = !isOwned && prerequisitesMet; CreateListItem(upgrade, isOwned, canPurchase); } } /// /// 리스트 아이템 생성 /// private void CreateListItem(UpgradeData upgrade, bool isOwned, bool canPurchase) { if (_listItemPrefab == null || _contentParent == null) return; GameObject itemObj = Instantiate(_listItemPrefab, _contentParent); var listItem = itemObj.GetComponent(); if (listItem != null) { listItem.Setup(upgrade, isOwned, canPurchase, this); _listItems.Add(listItem); } else { // UpgradeListItem 컴포넌트가 없으면 추가 listItem = itemObj.AddComponent(); listItem.Setup(upgrade, isOwned, canPurchase, this); _listItems.Add(listItem); } } /// /// 리스트 비우기 /// private void ClearList() { foreach (var item in _listItems) { if (item != null && item.gameObject != null) { Destroy(item.gameObject); } } _listItems.Clear(); } /// /// 업그레이드 구매 요청 /// public void RequestPurchase(int upgradeId) { if (_playerUpgradeManager == null) return; _playerUpgradeManager.RequestPurchaseUpgrade(upgradeId); // 구매 후 목록 갱신 RefreshList(); UpdateManaDisplay(); } /// /// 마나 표시 업데이트 /// private void UpdateManaDisplay() { if (_manaText == null) return; var core = CoreResourceManager.Instance?.mainCore; if (core != null) { _manaText.text = $"MANA: {core.TotalResources}"; } } /// /// 팝업 닫기 /// public void Close() { gameObject.SetActive(false); } private void OnDestroy() { ClearList(); } } }