[Toy/Unity] JSON 데이터 로드

0시0분·2024년 7월 15일
0

Toy

목록 보기
12/18

1. Json 구조 생성

이전 글의 대화 기능을 데이터로 관리하기 위해 json 파일을 생성했다.

{
    "npcData":
    [
        {
            "npcId": 1,
            "name": "호박",
            "lines": 
            [
                {
                    "id": 0,
                    "text": "안녕하세요"
                },
                {
                    "id": 1,
                    "text": "반갑습니다"
                }
            ]
        },
        {
            "npcId": 2,
            "name": "수박",
            "lines": 
            [
                ...
            ]
        }
    ]
}

위 구조로 틀을 잡았다.

[System.Serializable]
public class NpcClass
{
    public int npcId;
    public string name;
    public lineInfo[] lines;
}

[System.Serializable]
public struct lineInfo
{
    public int id;
    public string type;
    public string text;
}

[System.Serializable]
public class NpcInfoData
{
    public NpcClass[] npcData;
}

위 클래스 및 구조체는 NPC와의 대화 기능에 들어가므로
DialogueManager를 만들어 그 안에 생성했다.

객체 내의 리스트 구조를 로드해오는데에 애를 많이 먹었다.
리스트에 저장이 안돼서 한참 헤맸는데
알고보니 lineInfo 에 [System.Serializable] 를 추가를 안했다..
이걸 읽는 누군가는 이런 기본적인 실수를 하지 않길 바란다. 😫


2. Json 로드

나중에는 모르겠지만 당장은 객체를 json으로 변경하는 구조는 필요가 없어서
로드하는 기능만 추가했다.

public T LoadJsonFile<T>(string loadPath, string fileName) 
{
    string path = $"{loadPath}/{fileName}.json";
    if (File.Exists(path) == false) 
        return default;
    string data = File.ReadAllText(path);
    return JsonUtility.FromJson<T>(data);
}

load 할 수 있는 다양한 방법이 있었는데 일단은 가장 심플한 방식을 선택했다.
다른 방법은 아래에 링크를 남겨두겠다.

호출할 때는 아래와 같이 사용하면 된다.

string path = Application.dataPath + "/Data/Json";  
npcInfoData = DataManager.Inst.LoadJsonFile<NpcInfoData>(path, "NPC");

3. 주의할 부분

3-1.

[System.Serializable]
public class NpcInfoData
{
    public NpcClass[] npcData;
}
private NpcInfoData npcInfoData;

Npc의 데이터가 여러개 존재할 수 있으므로 배열 구조로 받아야 하는데,
타입 T의 형태를 NpcClass[] 로 받으면 에러가 발생한다.
정확히 에러 메세지는 기억이 나지 않는데,
온전한 Object형이어야 한다는 내용이었던 것 같다.

따라서 멤버로 NpcClass[] 를 갖는 클래스를 하나 생성하여
T에 넣어주면 문제 없이 로드가 된다.

3-2.

또한, 변수명이 json 에 선언된 이름과 완벽하게 동일해야 인식이 된다.



📒 다음에 할일
선택지 기능 코드 정리하기


참고 블로그
👀 https://codeposting.tistory.com/entry/Unity-json-%EC%A7%81%EB%A0%AC%ED%99%94-%EC%A0%80%EC%9E%A5-%EC%95%94%ED%98%B8%ED%99%94-utf8
👀 https://wergia.tistory.com/164
👀 https://velog.io/@livelyjuseok/C-Unity-%EB%AF%B8%EC%85%98%EC%9D%84-Json%EC%9C%BC%EB%A1%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0
👀 https://dev-mark.tistory.com/9
👀 https://forum.unity.com/threads/argumentexception-json-must-represent-an-object-type.846031/

0개의 댓글