게임 내에서 사용되는 데이터를 코드 안에 정의한다면 유지보수 측면에서 매우 불리해진다.
(게임 내 수치를 변화하는 패치를 할 때마다 스토어에 새로 올려야 한다.)
따라서 수치 등을 Xml 혹은 Json 파일로 저장하고 코드로 불러오는 방식으로 게임 내 데이터를 관리하는 것이 유리하다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Data
{
#region
[Serializable]
public class Stat
{
public int level;
public int maxHp;
public int attack;
public int totalExp;
}
[Serializable]
public class StatData : ILoader<int, Stat>
{
public List<Stat> stats = new List<Stat>();
public Dictionary<int, Stat> MakeDict()
{
Dictionary<int, Stat> dict = new Dictionary<int, Stat>();
foreach (Stat stat in stats)
dict.Add(stat.level, stat);
return dict;
}
}
#endregion
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface ILoader<Key, Value>
{
Dictionary<Key, Value> MakeDict();
}
public class DataManager
{
public Dictionary<int, Data.Stat> StatDict { get; private set; } = new Dictionary<int, Data.Stat> ();
public void Init()
{
StatDict = LoadJson<Data.StatData, int, Data.Stat>("StatData").MakeDict();
}
Loader LoadJson<Loader, Key, Value>(string path) where Loader : ILoader<Key, Value>
{
TextAsset textAsset = Managers.Resource.Load<TextAsset>($"Data/{path}");
return JsonUtility.FromJson<Loader>(textAsset.text);
}
}
[Serializable]는 외부 파일에서 데이터를 가져올 때 작성해야한다.
MakeDict() 함수 내에서 Dictionary에 값을 foreach문을 사용해서 추가하고 있는데 이 부분은 Linq를 사용해서 대체 가능하지만 Linq가 아이폰에서의 버그가 많기 때문에 Linq를 사용하지 않는 것을 추천한다고 한다.