[ JSON with Unity ] 멀티 엔딩을 위한 JSON

devKyoun·2024년 10월 29일
0

Unity

목록 보기
19/27
post-thumbnail

개요

멀티엔딩 게임을 만들때 필요한 대사는 수십가지, 상황도 수십가지이다.
그러한 모든 상황에서 대사들을 게임 내에 저장해놔야 하는데 너무나도 큰 데이터 파일이 필요하다.

유니티 내에 저장을 효율적으로 좋게 하려면 JSON을 사용해야겠다 생각이 들었다.


Serialization & Deserialization

JSON을 알기전에 윤니티에서 직렬화, 역직렬화를 알아두어야 한다.
Serialization ( 직렬화 ) : 오브젝트를 연속된 문장 형태나 연속된 Byte 형태로 변환하는 것이다.

왜 바꾸냐면 오브젝트에서 직렬화를 하면 드라이브에서도 저장이 가능해지고 전송도 가능해지기때문
역직렬화는 반대라고 생각하면 됨.

예시
유니티 내에 게임 오브젝트 A를 게임에서 편집하는데 프로그램을 종료해도 편집한 정보가 남아있다. 이 이유는 사실 Serialization을 해서 우리는 본질적으로 텍스트 파일을 편집하는 것이기 때문이다. 컴퓨터 내에 이 파일이 저장이 되고 유니티를 다시 켰을때 이 파일이 역직렬화를 통해 게임 오브젝트 A가 생겨나는 것.


JSON

오브젝트를 Key : Value 형태로 사람이 읽을 수 있는 형태의 데이터 포멧이다

그냥 유니티 내에 데이터 저장해도 되지 않나 할 수 있는데
그러면 MonoBehaviour 까지 저장이 된다.
데이터 관리도 절대 안된다.
한 두개 대사가 있는게 아니기 때문에..

그래서 수많은 데이터 혹은 저장/불러오기를 해야한다면 JSON 포멧을 사용하자


어떤 형태로 데이터를 만들어야 하는가?

내가 필요한 것은 이벤트 ID. 즉, 이 대사들이 언제 나와야 하는지 그 ID가 필요하다

그리고 대사들이다.

그 다음은 대사를 치는 캐릭터의 ID이다.

이 정보들을 데이터로 만들 것이고, 유니티 내에서 관리해줘서 사용하려고 한다.


JSON 정보 읽기

{
	"id": 1,

	"lines": [
		{
			"speaker": 1,
			"text": "전하, 상국하셨사옵니까?"
		},
		{
			"speaker": 1,
			"text": "전하께옵서 상왕 전화로부터 일찍이 왕위를 이어받으셨사온데"
		},
		{
			"speaker": 1,
			"text": "대신들 간에선 국세가 흐려질까 염려하옵니다."
		},
		{
			"speaker": 1,
			"text": "전하의 성안과 깊으신 지혜로 앞으로의 국세가 안정될 것임을 널리 보여주시옵소서."
		}
	]
}

이러한 형태로 구현해야한다 왜 와이

우선 speaker가 필요한 이유는 대사를 할때 작게 이미지를 첨부하여 누가 말하는지 더 명확하게 해주려고 한다
그리고 { speakr, text } 형태로 해준 이유는 그렇게 해야 대사 출력을 할때 더 효율적으로 구현이 가능하기 때문이다

이러한 JSON 형태를 읽어주려면 JSON Data Class를 따로 생성하고 손 봐주어야한다

public class Line
{
    public int speaker;
    public string text;
}
public class JsonData
{
    public int id;

    public List<Line> lines;
}

이러한 Line 이라는 클래스를 만들어주고
실질적으로 대사 출력하는데 필요한 것들을 잘 정리한
Dialogue 클래스를 만들어준다

[System.Serializable]
public class Dialogue
{
    public int speaker;

    public List<string> lines;

}

바로 JSON Data를 사용하면 데이터가 날라가는데 이유는 잘..
그래서 좀 애먹다가 그냥 Dialogue 클래스를 직관적으로 만들어서 사용했다.

이제 JSON 파일을 읽어내고 Dialogue에 까지 추가하면 된다.

public void UpdateDialogue(Dialogue dialogue)
{
    

    string path = Path.Combine(Application.dataPath, "TextFile1.json");
    string jsonData = File.ReadAllText(path);
    JsonData sample = JsonConvert.DeserializeObject<JsonData>(jsonData);


    // 화면 세팅

    

    foreach (var line in sample.lines)
    {
        Debug.Log(line.text);
        dialogue.speaker = line.speaker;   
        dialogue.lines.Add(line.text);
    }
}

결과

잘되는 모습. 여러 상황을 추가해서 이미지도 변화하고 이름까지 표시 할 예정이다.

profile
Game Developer

0개의 댓글