이전 글의 대화 기능을 데이터로 관리하기 위해 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] 를 추가를 안했다..
이걸 읽는 누군가는 이런 기본적인 실수를 하지 않길 바란다. 😫
나중에는 모르겠지만 당장은 객체를 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");
[System.Serializable]
public class NpcInfoData
{
public NpcClass[] npcData;
}
private NpcInfoData npcInfoData;
Npc의 데이터가 여러개 존재할 수 있으므로 배열 구조로 받아야 하는데,
타입 T의 형태를 NpcClass[] 로 받으면 에러가 발생한다.
정확히 에러 메세지는 기억이 나지 않는데,
온전한 Object형이어야 한다는 내용이었던 것 같다.
따라서 멤버로 NpcClass[] 를 갖는 클래스를 하나 생성하여
T에 넣어주면 문제 없이 로드가 된다.
또한, 변수명이 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/