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