유니티
유니티 저장 시스템 구현 (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, 저장할 인스턴스)를 사용해야 한다.