https://01149.tistory.com/139

 

TIL : 2024-11-27(수) :: 최종프로젝트 개발 일지(3) - 외부데이터 사용에 대한 고찰(2)

최종프로젝트 외부데이터를 어떻게 확장성을 확보할수 있을까? 하며 생각을 하며 튜터님께 질문을 했을때"고정 데이터인데 이걸 확장성을 볼 필요가있나? " , " 고정 데이터는 해당 class의 데이

01149.tistory.com

해당 글하고 연관이 되어있다.

어제 분명 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

 

GitHub - npckero/ExcelToJsonWizard: A tool for converting Excel data to JSON files and generating C# loader classes for use in U

A tool for converting Excel data to JSON files and generating C# loader classes for use in Unity. - npckero/ExcelToJsonWizard

github.com

 

Excel -> Json으로 변경을 해주는 Tool 프로그램이다.

 

해당 프로그램을 사용하면 Excel 데이터를 Json으로 변경해주고 

 

Excel 헤더 데이터를 참고하여 만들어진 Class 파싱 데이터 구조
해당 Json을 읽어주는 Loader Class를 만들어준다.

 

해당 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 데이터를 가져와 컨테이너에 보관하는 매니저라고 보면된다. 

+ Recent posts