해당 글하고 연관이 되어있다.
어제 분명 CSV를 데이터 읽는데만 사용하고 Json을 이용하여 UserData를 저장/불러오기 목적으로 구조를 잡았으나
튜터님들의 의견과 다시 생각해보니 CSV를 쓰는 이유가 없어진것 같았다.
*CSV데이터를 Json으로 다 변경한 이유
1.CSV 나 Json이나 파일 쓰기/읽기는 둘다 Excel또는 txt로 관리하기에 상관이 없었다.
2.CSV는 기획자가 데이터를 바로 수정하고 확인 하기에 유용하기는 하나 결국에는 런타임시에 데이터가 적용된것을 확인 할 수 있기에 기획자와 소통목적으로 CSV를 사용한다고 말해도 애매하였다.
3.서버와 통신을 하게될 경우 Json 구조를 사용 하기에 게임이 라이브서비스로 인 경우 Json이 더욱 유리하였다.
4.해당 이유는 팀원과 작업하면서 느낀건데 CSV로 Enemy ,Item을 관리하다가 하나의 Column(컬럼)에 여러개의 데이터가 들어가게 되는 경우 관리가 엄청 어려워지고(Enemy의 DropItem , Item의 가챠확률 등등), 데이터 양이 늘어날수록 CSV는 Json처럼 계층구조로 되어있지 않기에 가독성 및 유지보수에 좋지 않다고 느껴졌다.
이러한 이유로 인해서 Json을 사용하게 되었고 , 그럼 Excel을 Json으로 대체하는 방법이 필요한데
좋은 Tool 이 있어서 이것을 사용하여 진행 하였다.
https://github.com/npckero/ExcelToJsonWizard
Excel -> Json으로 변경을 해주는 Tool 프로그램이다.
해당 프로그램을 사용하면 Excel 데이터를 Json으로 변경해주고
해당 Tool을 이용해서 DataManager에서 세팅을 하고, 팀원들이 데이터가 필요할떄 꺼내 쓸수 있게 하였다.
DataManager.cs
public class DataManager : SingletonDDOL<DataManager>
{
private readonly string jsonItemDBPath = "JSON/ItemDB";
private readonly string jsonSellItemDBPath = "JSON/SellItemDB";
private readonly string jsonEnemyDBPath = "JSON/EnemyDB";
private readonly string jsonStageDBPath = "JSON/StageDB";
private readonly string jsonSoulDBPath = "JSON/SoulDB";
private readonly string jsonSkillDBPath = "JSON/SkillDB";
private readonly string jsonUserDataPath = Application.dataPath + "/userdata.json";
private StringBuilder strBuilder = new StringBuilder();
public JsonController JsonController = new JsonController();
private EnemyDBLoader enemyDB;
private ItemDBLoader itemDB;
private SellItemDBLoader sellItemDB;
private StageDBLoader stageDB;
private SoulDBLoader soulDB;
private SkillDBLoader skillDB;
public EnemyDBLoader EnemyDB { get => enemyDB; }
public ItemDBLoader ItemDB { get => itemDB; }
public SellItemDBLoader SellItemDB { get => sellItemDB; }
public StageDBLoader StageDB { get => stageDB; }
public SoulDBLoader SoulDB { get => soulDB; }
public SkillDBLoader SkillDB { get => skillDB; }
private Inventory inventory = new Inventory();
private UserData userData = new UserData();
public UserData UserData { get => userData;}
public static event Action<UserData> OnEventSaveUserData;
public static event Action OnEventLoadUserData;
protected override void Awake()
{
base.Awake();
OnEventSaveUserData += SaveUserData;
OnEventLoadUserData += LoadUserData;
}
private void Start()
{
enemyDB = new EnemyDBLoader(jsonEnemyDBPath);
itemDB = new ItemDBLoader(jsonItemDBPath);
sellItemDB = new SellItemDBLoader(jsonSellItemDBPath);
stageDB = new StageDBLoader(jsonStageDBPath);
soulDB = new SoulDBLoader(jsonSoulDBPath);
skillDB = new SkillDBLoader(jsonSkillDBPath);
inventory.Items = new List<ItemDB>();
inventory.Items.Add(itemDB.GetByKey(1000));
inventory.Items.Add(itemDB.GetByKey(2000));
userData.UserID = 12345;
userData.Nickname = "지존 감자탕";
userData.Status = new Stat();
userData.Status.level = 1;
userData.Gold = 999999;
userData.Diamonds = 9999;
userData.PlayTimeInSeconds = 72000;
//userData.Inventory = inventory;
}
private void SaveUserData(UserData userData) // 유저 데이터 세이브
{
JsonController.SaveUserData(userData, jsonUserDataPath);
}
private void LoadUserData() // 유저 데이터 로드
{
userData = JsonController.LoadUserData(jsonUserDataPath);
}
//Debug
private void Update()
{
if (Input.GetKeyDown(KeyCode.D)) // 데이터 갱신
{
userData.Nickname += "_WA";
}
else if(Input.GetKeyDown(KeyCode.S))
{
OnEventSaveUserData?.Invoke(userData);
}
else if( Input.GetKeyDown(KeyCode.L))
{
OnEventLoadUserData?.Invoke();
}
}
}
코드에서 Test 목적으로 작성해놓은게 있지만, Json 데이터를 가져와 컨테이너에 보관하는 매니저라고 보면된다.