[TIL] Unity - 직렬화 & 역직렬화 (3)

MINO·2024년 6월 17일
0
post-thumbnail

2024-06-17


직렬화 / 역직렬화

내일배움캠프 심화 주차 개인 프로젝트로, 2D 클리커 게임을 제작하였다.

2D Clicker - ReadMe

선택 구현 사항으로 데이터 저장 및 불러오기 기능이 있어,
이전에 포스팅한 C# - 직렬화 & 역직렬화 과 최근 들은 직렬화 강의를 떠올리며 기능을 구현해보았다.


Newtonsoft.Json

이전에 포스팅한 직렬화 기법은 Newtonsoft.Json 패키지를 설치하여
직렬화 및 역직렬화를 진행하였다.

아래 내용은 게임 제작을 위한JSON 라이브러리 성능 비교 논문 에서 발췌한 내용이다.

PC와 Smart Phone 환경 모두 JsonUtility 가 LitJson 과 Newtonsoft.Json 보다 4~6배 정도 빠르다는 결과를 얻었다.
게임 제작 시에 주로 사용되는 JSON의 용도 중에 게임 데이터 저장 및 로드 하는 용도나 퀘스트 및 스토리 데이터 관리 용도와 같이 직렬화, 역 직렬화가 빈번하게 발생하고,
속도가 중요한 용도에는 JsonUtility를 사용하는 것이 효과적이다.


이전 포스팅을 작성할 때는,

  • 직렬화와 역직렬화가 어떤 기능을 수행하는지
  • 어떤 방식으로 데이터가 저장되는지

를 공부하며, 다양한 직렬화 방법 중 한 가지를 배웠었다.


JsonUtility

PC 와 SmartPhone 모두 JsonUtility 가 더 빠르다는 결과를 알게 되어
해당 방법으로 직렬화와 역직렬화 기능을 구현해보았다.


JsonUtility.ToJson()

객체를 JSON 형식의 문자열로 변환하기 위해 사용한다.
JSON 데이터는 공백이나 들여쓰기를 포함하지 않는 간결한 형식으로 출력된다.

string json = JsonUtility.ToJson(data);

JsonUtility.FromJson()

JSON 형식의 문자열을 객체로 변환하는 데 사용한다.
JSON 데이터를 객체로 역직렬화할 때 사용한다.

data = JsonUtility.FromJson<T>(json);

활용 방법

2D_Clicker 의 저장할 데이터로는 ShopData, UserData 가 존재한다.

2가지의 객체를 저장해야 하므로 제네릭 형식인 T 로 Serialize , DeSerialize 함수를 생성하였다.

public static class DataManager
{
    public static void Serialize<T>(T data, string pathName)
    {
        string json = JsonUtility.ToJson(data);
        string filePath = Path.Combine(Application.dataPath, pathName);
        File.WriteAllText(filePath, json);
    }

    public static T DeSerialize<T>(string json)
    {
        if (json == null)
        {
            Debug.Log("역직렬화할 데이터가 없음");
            return default(T);
        }
            

        T data = JsonUtility.FromJson<T>(json);
        return data;
    }
}

또한, 각각의 스크립트 (Shop.cs , GameManager.cs) 에서 직렬화, 역직렬화 함수를 사용하기 위해 DataManager 클래스를 static 으로 선언하였다.

// Shop.cs
void LoadData()
{
	if (!File.Exists(filePath))
	{
		Debug.Log("파일이 존재하지 않음");
		return;
	}

	var jsonData = File.ReadAllText(filePath);

	if (jsonData == null)
	{
		Debug.Log("파일이 비어있음");
		return;
	}

	var data = DataManager.DeSerialize<ShopData>(jsonData);
}

TIL 마무리

JsonUtility , Newtonsoft.Json , LitJson 의 직렬화, 역직렬화 시간을 비교한 논문이 있다는 것이 매우 흥미로웠다.

앞으로 한 가지 기능을 여러 방법으로 구현할 수 있다면,
관련 논문 등을 통해 더 빠르거나 안전한 방법으로 개발할 수 있는 기능을 선택하도록 해야겠다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글