178 lines
5.3 KiB
C#
178 lines
5.3 KiB
C#
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
|
|
}
|
|
}
|