업그레이드 데이터 입력 로직 및 기능 추가
캐릭터 스탯을 PlayerStats 컴포넌트에서 모아서 관리하도록 변경 코드에서도 마찬가지
This commit is contained in:
177
Assets/Scripts/UpgradeDatabase.cs
Normal file
177
Assets/Scripts/UpgradeDatabase.cs
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user