TIL 0301 게임개발 심화 팀 - 3 / 딕셔너리 -> JSON

강성원·2024년 3월 5일
0

TIL 오늘 배운 것

목록 보기
44/70

딕셔너리 데이터를 Json으로

의도한 기능 구현

곡 이름마다 유저 이름, 점수 를 저장하려고 하였다.

유저 이름과 점수는 하나의 클래스(RankingEntry)로 묶어두었음.

곡 이름을 키로, RankingEntry 리스트를 밸류로 하여 랭킹 정보를 딕셔너리 데이터로 Json에 저장하고자 하였다.

문제점

유니티에서 제공하는 JsonUtility는 딕셔너리 형태의 데이터를 바로 저장하도록 지원하지 않는다..!!

나중에 보니 리스트도 그 상태 그대로 저장하는 것을 지원하지 않더라..

해결 방법

절차는 크게 2단계로 이루어진다.

  1. 딕셔너리의 키-값 쌍을 동일한 데이터 자료형의 변수를 가진 RankingMap 클래스의 변수에 옮겨주는 데이터 변환 작업을 해준다.
  • 딕셔너리의 키-값쌍 하나당 RankingMap 클래스 하나이다.
public class RankingMap
{
    public string key;
    public List<RankingEntry> value = new List<RankingEntry>();
}



  1. RankingMap클래스의 객체들을 리스트로 가지는 RankingMapWrap 클래스의 객체를 Json 데이터로 저장해준다.
    -> 리스트 자체만으로 Json데이터로 저장이 되지 않아서 리스트를 감싸주는 RankingMapWrap이 필요했다.
public class RankingMapWrap
{
    public List<RankingMap> RankingMapList = new List<RankingMap>();
}

위 내용 반영한 저장 기능

public void SaveRankingMap()
{
    string filePath = GetSaveFilePath();

    RankingMapWrap rankingMapWrap = new RankingMapWrap();

    foreach (var ranking in rankingMap)
    {
        RankingMap entry = new RankingMap
        {
            key = ranking.Key,
            value = ranking.Value
        };

        rankingMapWrap.RankingMapList.Add(entry);
    }

    string jsonData = JsonUtility.ToJson(rankingMapWrap, true);
    File.WriteAllText(filePath, jsonData);
}
  • foreach문 안에서 딕셔너리의 내용을 RankingMap의 인스턴스에 옮겨준다.

  • 그리고 RankingMapWrap의 인스턴스의 리스트에 RankingMap의 인스턴스를 추가해준다.

  • 마무리로 RankingMapWrap의 인스턴스를 Json으로 변형시켜주면 완벽하게 딕셔너리의 내용이 저장된다.

profile
개발은삼순이발

0개의 댓글