108 lines
4.0 KiB
C#
108 lines
4.0 KiB
C#
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using UnityEngine.Localization.SmartFormat.PersistentVariables;
|
|
|
|
namespace DDD
|
|
{
|
|
/// <summary>
|
|
/// Smart String 변수 전담 매니저.
|
|
/// - VariablesGroupAsset 안의 변수들을 생성/재사용하고 값만 갱신(무가비지).
|
|
/// - {day}, {playerName}, {money} 등 공용 Set API 제공.
|
|
/// </summary>
|
|
public class SmartStringVariables : Singleton<SmartStringVariables>, IManager
|
|
{
|
|
private VariablesGroupAsset _vars;
|
|
private GameStateSo _gameStateSo;
|
|
|
|
private const string VariablesGroupAssetKey = "SmartStringGroup";
|
|
private const string Daykey = "day";
|
|
|
|
public void PreInit() { }
|
|
|
|
public async Task Init()
|
|
{
|
|
_vars = await AssetManager.LoadAsset<VariablesGroupAsset>(VariablesGroupAssetKey);
|
|
Debug.Assert(_vars != null, "_variablesGroupAsset is null");
|
|
|
|
_gameStateSo = await AssetManager.LoadAsset<GameStateSo>(DataConstants.GameStateSo);
|
|
Debug.Assert(_gameStateSo != null, "_gameStateSo is null");
|
|
|
|
// 예시: day 초기 세팅 (없으면 생성, 타입 다르면 교체)
|
|
Set(Daykey, _gameStateSo.GetCurrentLevel());
|
|
}
|
|
|
|
public void PostInit() { }
|
|
|
|
public VariablesGroupAsset GetVariablesGroupAsset() => _vars;
|
|
|
|
// ---------- 공용 Set API (가비지 최소화) ----------
|
|
|
|
/// <summary>int 변수 세팅. {key} 로 접근.</summary>
|
|
public void Set(string key, int value)
|
|
{
|
|
var v = Ensure<IntVariable>(key);
|
|
if (v.Value != value) v.Value = value;
|
|
}
|
|
|
|
/// <summary>float 변수 세팅. {key} 로 접근.</summary>
|
|
public void Set(string key, float value)
|
|
{
|
|
var v = Ensure<FloatVariable>(key);
|
|
if (!Mathf.Approximately(v.Value, value)) v.Value = value;
|
|
}
|
|
|
|
/// <summary>bool 변수 세팅. {key} 로 접근.</summary>
|
|
public void Set(string key, bool value)
|
|
{
|
|
var v = Ensure<BoolVariable>(key);
|
|
if (v.Value != value) v.Value = value;
|
|
}
|
|
|
|
/// <summary>string 변수 세팅. {key} 로 접근.</summary>
|
|
public void Set(string key, string value)
|
|
{
|
|
var v = Ensure<StringVariable>(key);
|
|
if (!string.Equals(v.Value, value)) v.Value = value;
|
|
}
|
|
|
|
/// <summary>
|
|
/// enum은 보통 현지화 포맷에서 문자열로 취급하는 편이 직관적입니다.
|
|
/// 필요시 IntVariable로 바꾸고 (int)(object)value 저장하는 버전도 추가 가능.
|
|
/// </summary>
|
|
public void SetEnum<TEnum>(string key, TEnum value) where TEnum : struct
|
|
{
|
|
var v = Ensure<StringVariable>(key);
|
|
string s = value.ToString();
|
|
if (!string.Equals(v.Value, s)) v.Value = s;
|
|
}
|
|
|
|
// ---------- 유틸 ----------
|
|
|
|
/// <summary>
|
|
/// key에 해당하는 변수가 있고 타입이 일치하면 캐시 반환.
|
|
/// 없거나 타입이 다르면 교체(Add/Remove)하여 보장.
|
|
/// </summary>
|
|
private T Ensure<T>(string key) where T : class, IVariable, new()
|
|
{
|
|
Debug.Assert(!string.IsNullOrEmpty(key), "SmartStringVariables.Ensure: key is null or empty.");
|
|
Debug.Assert(_vars != null, "SmartStringVariables.Ensure: _vars is null (Init 순서 확인).");
|
|
|
|
if (_vars.TryGetValue(key, out var existing))
|
|
{
|
|
if (existing is T ok) return ok;
|
|
_vars.Remove(key); // 타입 다르면 제거 후 교체
|
|
}
|
|
|
|
var created = new T();
|
|
_vars.Add(key, created);
|
|
return (T)created;
|
|
}
|
|
|
|
/// <summary>변수 존재 여부.</summary>
|
|
public bool Has(string key) => _vars != null && _vars.ContainsKey(key);
|
|
|
|
/// <summary>변수 제거.</summary>
|
|
public bool Remove(string key) => _vars != null && _vars.Remove(key);
|
|
}
|
|
}
|