176 lines
5.0 KiB
C#
176 lines
5.0 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
|
|
{
|
|
[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()
|
|
{
|
|
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()
|
|
{
|
|
ClearList();
|
|
}
|
|
}
|
|
}
|