본문 바로가기

C#/게임 제작 + TIL

일기장 정보 불러오기 (Json 활용)

이전에는 카드 데이터 등을 csv가지고 간단한 parse를 통해 분리된 정보를 불러왔다.

하지만 이번에 작업을 진행할 일기장 같이,  쉼표 가 많은 텍스트 정보는 JSON으로 사용을 하는게 좋다고 생각했고,  JSON을 사용한 방식으로 구현해 보았다.

 

 

 


 

 

 

DiaryBook 클라스를 만들고 각 스테이지별 (1~5 스테이지) 이야기 진행도를 기록하기 위해 5개의 일기장 그룹을 만들었다.

public class DiaryBook : MonoBehaviour, IBookControl
{
    // 각 스테이지 별 다이어리 데이터 (1 스테이지 ~ 5 스테이지)
    List<DiaryData>[] diaryGroups = new List<DiaryData>[5]; // tag_num 0~4
    
    
    public void InitDictionary()
	{
    // Resources 폴더에 있는 DiaryData.json 로드
    TextAsset jsonText = Resources.Load<TextAsset>("ExternalFiles/DiaryData"); // 확장자 제거
    if (jsonText == null)
    	{
        Debug.LogError("[InitDictionary] DiaryData.json not found.");
        return;
    	}

    for (int i = 0; i < 5; i++)
        diaryGroups[i] = new List<DiaryData>();

    DiaryListWrapper wrapper = JsonUtility.FromJson<DiaryListWrapper>(jsonText.text);
    foreach (var data in wrapper.diaries)
    	{
        if (data.tag_num >= 0 && data.tag_num < 5)
            diaryGroups[data.tag_num].Add(data);
    	}

    // 정렬까지 해놓고 저장
    for (int i = 0; i < 5; i++)
        diaryGroups[i] = diaryGroups[i].OrderBy(d => d.index).ToList();

    Debug.Log($"[InitDictionary] JSON loaded. Total count: {wrapper.diaries.Count}");
	}

}

 

 

 

 

 

Json 파일로 된 일기장 데이터 파일을 DiaryData 클래스로 받아오는 작업 자체는  간단히 이 두줄로도 구현은 가능하지만,


TextAsset jsonText  =  Resources.Load<TextAsset>("ExternalFiles/DiaryData");

@@  =  JsonUtility.FromJson <DiaryListWrapper>(jsonText.text);

 

여기서 중요한 부분은 JsonUtility는 직접적으로 List <T> 또는 Dictionary 형식으로 파싱을 할 수 없다는 점이다.

 

 

 

[System.Serializable]
public class DiaryData 
{
    public int index; // 다이어리 인덱스
    public int tag_num; // 스테이지 번호
    public string title; // 다이어리 제목
    public string contents; // 다이어리 내용
    public bool isOpen; // 다이어리 열림 여부 (스테이지 진행에 따라 진행)
}

 

이러한 데이터의 리스트에 직접 받기 전에

 

[System.Serializable]
public class DiaryListWrapper
{
    public List<DiaryData> diaries;
}

 

 

 

이러한 래퍼 클래스를 거쳐야 하며, 이렇게 사용하려면 기존의 JSON 파일의 데이터 역시 아래와 같은 형식
Ex) ("@@@" : [ 기존 JSON ]) 으로 수정해 주어야 오류가 생기지 않고 정상적으로 데이터에 접근이 가능하다.

 

 

JSON 형식의 데이터 파일

{
  "diaries": [
    {
      "index": 0,
      "stageNum": 0,
      "title": "첫 번째 이야기",
      "contents": "...",
      "isOpen": false
    },
    {
      "index": 1,
      "stageNum": 1,
      "title": "두 번째 이야기",
      "contents": "...",
      "isOpen": false
    }
  ]
}

 

 

 


 

 

이런 식으로 일기장의 JSON 데이터를, 래퍼를 거쳐서 데이터를 받아온 뒤, 일기장을 페이지마다 업데이트해주기만 하면 아래와 같이 정상적으로 데이터를 로드하는 모습을 볼 수 있다.