이전에는 카드 데이터 등을 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 데이터를, 래퍼를 거쳐서 데이터를 받아온 뒤, 일기장을 페이지마다 업데이트해주기만 하면 아래와 같이 정상적으로 데이터를 로드하는 모습을 볼 수 있다.
'C# > 게임 제작 + TIL' 카테고리의 다른 글
유니티 에디터 (0) | 2025.05.09 |
---|---|
유니티 에디터 윈도우 (1) | 2025.04.30 |
카드 정보 UI (Dictionary 활용) (0) | 2025.04.21 |
UI - 팝업 시스템 (1) | 2025.04.18 |
Dotween OnComplete() - 람다에서 루프 변수 참조시 변수 값 캐싱 (0) | 2025.04.08 |