업그레이드 데이터 입력 로직 및 기능 추가

캐릭터 스탯을 PlayerStats 컴포넌트에서 모아서 관리하도록 변경
코드에서도 마찬가지
This commit is contained in:
2026-02-23 00:21:44 +09:00
parent b34254137f
commit cc475bce3e
54 changed files with 1402 additions and 98 deletions

View File

@@ -0,0 +1,177 @@
using System.Collections.Generic;
using UnityEngine;
using Northbound.Data;
namespace Northbound
{
/// <summary>
/// 업그레이드 데이터를 자동으로 로드하고 관리하는 싱글톤
/// Resources 폴더에서 모든 UpgradeData를 자동으로 로드
/// </summary>
public class UpgradeDatabase : MonoBehaviour
{
private static UpgradeDatabase _instance;
public static UpgradeDatabase Instance => _instance;
// Resources에서 자동 로드된 데이터
private List<UpgradeData> _upgradeDataList = new List<UpgradeData>();
// 조회용 딕셔너리
private Dictionary<int, UpgradeData> _upgradeById = new Dictionary<int, UpgradeData>();
private Dictionary<string, List<UpgradeData>> _upgradesByCategory = new Dictionary<string, List<UpgradeData>>();
// Resources 경로
private const string UPGRADE_RESOURCES_PATH = "Data/ScriptableObjects/Upgrade";
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this;
LoadUpgradeData();
BuildLookupTables();
}
/// <summary>
/// Resources에서 모든 UpgradeData 자동 로드
/// </summary>
private void LoadUpgradeData()
{
_upgradeDataList.Clear();
var upgrades = Resources.LoadAll<UpgradeData>(UPGRADE_RESOURCES_PATH);
_upgradeDataList.AddRange(upgrades);
Debug.Log($"[UpgradeDatabase] {_upgradeDataList.Count}개의 업그레이드 데이터를 로드했습니다.");
}
/// <summary>
/// 조회용 테이블 구축
/// </summary>
private void BuildLookupTables()
{
_upgradeById.Clear();
_upgradesByCategory.Clear();
foreach (var upgrade in _upgradeDataList)
{
if (upgrade == null) continue;
// ID로 조회
if (!_upgradeById.ContainsKey(upgrade.id))
{
_upgradeById[upgrade.id] = upgrade;
}
// 카테고리로 조회
string category = upgrade.upgradeCategory;
if (!_upgradesByCategory.ContainsKey(category))
{
_upgradesByCategory[category] = new List<UpgradeData>();
}
_upgradesByCategory[category].Add(upgrade);
}
}
/// <summary>
/// 데이터 다시 로드 (에디터에서 데이터 변경 시 호출)
/// </summary>
public void ReloadData()
{
LoadUpgradeData();
BuildLookupTables();
}
#region Getters
/// <summary>
/// ID로 업그레이드 데이터 조회
/// </summary>
public UpgradeData GetUpgradeById(int id)
{
if (_upgradeById.TryGetValue(id, out var upgrade))
{
return upgrade;
}
Debug.LogWarning($"[UpgradeDatabase] ID {id}에 해당하는 업그레이드를 찾을 수 없습니다.");
return null;
}
/// <summary>
/// 카테고리로 업그레이드 목록 조회
/// </summary>
public List<UpgradeData> GetUpgradesByCategory(string category)
{
if (_upgradesByCategory.TryGetValue(category, out var upgrades))
{
return new List<UpgradeData>(upgrades);
}
return new List<UpgradeData>();
}
/// <summary>
/// 개인 업그레이드 목록 조회
/// </summary>
public List<UpgradeData> GetPersonalUpgrades()
{
var result = new List<UpgradeData>();
foreach (var upgrade in _upgradeDataList)
{
if (upgrade != null && upgrade.upgradeTarget == "person")
{
result.Add(upgrade);
}
}
return result;
}
/// <summary>
/// 팀 업그레이드 목록 조회
/// </summary>
public List<UpgradeData> GetTeamUpgrades()
{
var result = new List<UpgradeData>();
foreach (var upgrade in _upgradeDataList)
{
if (upgrade != null && upgrade.upgradeTarget == "share")
{
result.Add(upgrade);
}
}
return result;
}
/// <summary>
/// 모든 업그레이드 데이터 반환
/// </summary>
public List<UpgradeData> GetAllUpgrades()
{
return new List<UpgradeData>(_upgradeDataList);
}
/// <summary>
/// 선행 업그레이드 조건 충족 여부 확인
/// </summary>
public bool ArePrerequisitesMet(int upgradeId, HashSet<int> ownedUpgradeIds)
{
var upgrade = GetUpgradeById(upgradeId);
if (upgrade == null) return false;
foreach (int requiredId in upgrade.requireUpgradeId)
{
if (!ownedUpgradeIds.Contains(requiredId))
{
return false;
}
}
return true;
}
#endregion
}
}