유니티/유니티 C#

[유니티/c#] json으로 데이터 관리하기

진서박 2023. 7. 27. 11:50
반응형

원래는 엑셀의 csv 파일로 데이터를 관리했지만, 이번에 Rookies님의 강의를 들으면서 json을 이용한 데이터 관리를 새롭게 배우게 되었다

 

메모장을 json확장자로 만들고 프로젝트 파일에 넣으면 사용이 가능하다.

 

 

파일은 다음과같이 사용되는데,

 

[ ] : List

{ } : Struct

처럼 생각하면 편하다. 간단히 말해서 stats라는 리스트 안의 인덱스에 속성이 정의되어 있는 구조체가 들어간다는 것이다

 

다음은 데이터를 관리하는 클래스를 만든다.

필요한것은

1. json으로 가져온 데이터를 보관할 클래스

2. 데이터를 관리하는 DataManager클래스

 

우선 1. json으로 가져온 데이터를 보관할 클래스를 작성한다.

 

public interface ILoader<Key, Value>
{
    Dictionary<Key, Value> MakeDic();
}

namespace Data
{
    #region Stat
    [Serializable]
    public class Stat
    {
        public int level;
        public int hp;
        public int attack;
    }

    [Serializable]
    public class StatData : ILoader<int, Stat>
    {
        public List<Stat> stats = new List<Stat>();

        public Dictionary<int, Stat> MakeDic()
        {
            Dictionary<int, Stat> dic = new Dictionary<int, Stat>();

            foreach (Stat stat in stats)
                dic.Add(stat.level, stat);

            return dic;
        }
    }
    #endregion
}

- 데이터 보관용도로 사용할것이기 때문에 동일한 이름을 가진 클래스와 겹치지 않도록 namespace를 지정해준다

- JSON 형식으로 데이터를 저장하거나 불러올 때는 클래스가 직렬화 가능해야 하므로, [Serializable] 속성을 붙여준다.

 

- 실제 데이터가 보관될 Stat 클래스에는 json에 선언한 속성들과 같은 이름의 변수들을 선언한다.

- ILoader 인터페이스를 구현하는 StatData클래스는 데이터를 딕셔너리 형태로 반환해야만 하므로 그에 맞는 로직을 구현한다.

 

 

마지막으로 2. 데이터를 관리하는 DataManager클래스 를 작성한다.

public class DataManager
{
    public Dictionary<int, Data.Stat> StatDic { get; private set; } = new Dictionary<int, Data.Stat>();

    public void Init()
    {
        StatDic = LoadJson<Data.StatData, int, Data.Stat>("StatData").MakeDic();
    }

    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);
    }
}

 

현재는 Stat데이터밖에 없으므로, Stat타입의 딕셔너리 밖에 없지만 추후에 데이터가 추가된다면 그 타입에 맞는 딕셔너리를 추가하여야 할것이다.

 

 

Init() : 최초 초기화 시 데이터를 불러온다.

 

LoadJson<>() :

- LoadJson의 반환형인 Loader는 ILoader<> 인터페이스를 구현한 클래스의 타입을 나타낸다.

- LoadJson은 ILoader<>인터페이스를 구현한 클래스와 그것의 Key와 Value를 매개변수로 받는다.

- TextAsset은 Resource.Load로 불러온 json파일을 로드한다.

- JsonUtility.FromJson<>() 메서드로 로드한 json 텍스트파일을 Loader타입으로 역직렬화 하여 반환한다.

 

 

 

    Loader LoadJson<Loader, Key, Value>(string path) where Loader : ILoader<Key, Value>
    {
        TextAsset textAsset = Managers.Resource.Load<TextAsset>($"Data/{path}");
        Debug.Log($"불러온 json 파일 : {textAsset}");
        return JsonUtility.FromJson<Loader>(textAsset.text);
    }

LoadJson에서 Debug.Log를 찍어보면

 

잘 찍히고

 

중단점을 찍어서 StatDic에 데이터가 들어왔는지 확인해보면

딕셔너리의 Key - level, Value - Stat클래스 로 잘 복사된 것을 볼 수 있다.

반응형