유니티

유니티 저장 시스템 구현 (Json 파일 이용)

fortissimo 2024. 2. 14. 00:28

데이터 직렬화


Json 파일을 이용해 데이터를 저장하고 불러오기 위해서는 데이터의 직렬화가 필요하다.

직렬화란 데이터 구조나 오브젝트를 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이라고 한다.

c#에서는 다음과 같이 System에 있는 [Seializable]을 사용한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
public class playerData : MonoBehaviour
{
    public static playerData instance;
    public string nickname;
    public int rank;
    public int EXP;
}

 

 

저장


string saveData = JsonUtility.ToJson(playerData.instance, true);
string path = Path.Combine(Application.dataPath, "playerData.json");
File.WriteAllText(path, saveData);

 

JsonUtility.ToJson()의 true는 가독성 있게 보여주도록 하는 인자이며, 없어도 무관하다.

해당 코드를 작성하여 실행해보면 해당 유니티 프로젝트의 저장 위치/Assets/에 playerData.json이라는 파일이 생성될 것이다.

 

로드


string path = Path.Combine(Application.dataPath, "playerData.json");
string saveData = File.ReadAllText(path); //json을 문자열로 읽어오는 과정

playerData p = JsonUtility.FromJson<playerData>(saveData); //일반 클래스일 경우

JsonUtility.FromJsonOverwrite(saveData, playerData.instance); //monobehavior을 상속받은 클래스일 경우

 

주의해야 할 점은 저장할 클래스가 MonoBehavior을 상속받지 않아야 한다는 점이다. MonoBehavior을 상속받은 클래스를 로드하려고 하면 ArgumentException: Cannot deserialize JSON to new instances of type '클래스 이름' 오류가 뜬다. 역직렬화에 실패했다는 뜻이다.

MonoBehavior을 상속받은 클래스를 정상적으로 불러오려면 JsonUtiltiy.FromJson() 대신 JsonUtiltiy.FromJsonOverWrite(string str, 저장할 인스턴스)를 사용해야 한다.