using System.Collections.Generic; using UnityEngine; using Northbound.Data; namespace Northbound { /// /// 씬에서 직접 참조한 UpgradeData ScriptableObject를 조회하는 싱글톤 /// public class UpgradeDatabase : MonoBehaviour { private static UpgradeDatabase _instance; public static UpgradeDatabase Instance => _instance; [Header("ScriptableObject Data")] [Tooltip("업그레이드 데이터의 단일 원본 목록입니다. Resources 자동 검색 대신 SO를 직접 등록합니다.")] [SerializeField] private List _upgradeDataList = new List(); // 조회용 딕셔너리 private Dictionary _upgradeById = new Dictionary(); private Dictionary> _upgradesByCategory = new Dictionary>(); private void Awake() { if (_instance != null && _instance != this) { Destroy(gameObject); return; } _instance = this; BuildLookupTables(); } /// /// 조회용 테이블 구축 /// 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; } else { Debug.LogError($"[UpgradeDatabase] 중복 업그레이드 ID: {upgrade.id}", upgrade); continue; } // 카테고리로 조회 string category = upgrade.upgradeCategory; if (!_upgradesByCategory.ContainsKey(category)) { _upgradesByCategory[category] = new List(); } _upgradesByCategory[category].Add(upgrade); } } /// /// 데이터 다시 로드 (에디터에서 데이터 변경 시 호출) /// public void ReloadData() { 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 } }