Files
Northbound/Assets/Scripts/UI/UpgradeListPopup.cs

186 lines
5.4 KiB
C#

using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using Northbound.Data;
namespace Northbound
{
/// <summary>
/// 업그레이드 목록 팝업 UI 컨트롤러
/// </summary>
public class UpgradeListPopup : MonoBehaviour
{
// 싱글톤 인스턴스 (UI 열림 상태 확인용)
private static UpgradeListPopup _instance;
public static bool IsOpen => _instance != null && _instance.gameObject.activeSelf;
[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<UpgradeListItem> _listItems = new List<UpgradeListItem>();
private void Awake()
{
_instance = this;
if (_closeButton != null)
{
_closeButton.onClick.AddListener(Close);
}
}
private void Update()
{
// ESC 키로 닫기
if (Keyboard.current != null && Keyboard.current.escapeKey.wasPressedThisFrame)
{
Close();
}
// 마나 텍스트 업데이트
UpdateManaDisplay();
}
/// <summary>
/// 팝업 초기화
/// </summary>
public void Initialize(PlayerUpgradeManager upgradeManager, PlayerStats playerStats)
{
_playerUpgradeManager = upgradeManager;
_playerStats = playerStats;
RefreshList();
UpdateManaDisplay();
gameObject.SetActive(true);
}
/// <summary>
/// 업그레이드 목록 갱신
/// </summary>
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);
}
}
/// <summary>
/// 리스트 아이템 생성
/// </summary>
private void CreateListItem(UpgradeData upgrade, bool isOwned, bool canPurchase)
{
if (_listItemPrefab == null || _contentParent == null) return;
GameObject itemObj = Instantiate(_listItemPrefab, _contentParent);
var listItem = itemObj.GetComponent<UpgradeListItem>();
if (listItem != null)
{
listItem.Setup(upgrade, isOwned, canPurchase, this);
_listItems.Add(listItem);
}
else
{
// UpgradeListItem 컴포넌트가 없으면 추가
listItem = itemObj.AddComponent<UpgradeListItem>();
listItem.Setup(upgrade, isOwned, canPurchase, this);
_listItems.Add(listItem);
}
}
/// <summary>
/// 리스트 비우기
/// </summary>
private void ClearList()
{
foreach (var item in _listItems)
{
if (item != null && item.gameObject != null)
{
Destroy(item.gameObject);
}
}
_listItems.Clear();
}
/// <summary>
/// 업그레이드 구매 요청
/// </summary>
public void RequestPurchase(int upgradeId)
{
if (_playerUpgradeManager == null) return;
_playerUpgradeManager.RequestPurchaseUpgrade(upgradeId);
// 구매 후 목록 갱신
RefreshList();
UpdateManaDisplay();
}
/// <summary>
/// 마나 표시 업데이트
/// </summary>
private void UpdateManaDisplay()
{
if (_manaText == null) return;
var core = CoreResourceManager.Instance?.mainCore;
if (core != null)
{
_manaText.text = $"MANA: {core.TotalResources}";
}
}
/// <summary>
/// 팝업 닫기
/// </summary>
public void Close()
{
gameObject.SetActive(false);
}
private void OnDestroy()
{
if (_instance == this)
{
_instance = null;
}
ClearList();
}
}
}