2024-06-17

내일배움캠프 심화 주차 개인 프로젝트로, 2D 클리커 게임을 제작하였다.
선택 구현 사항으로 데이터 저장 및 불러오기 기능이 있어,
이전에 포스팅한 C# - 직렬화 & 역직렬화 과 최근 들은 직렬화 강의를 떠올리며 기능을 구현해보았다.
이전에 포스팅한 직렬화 기법은 Newtonsoft.Json 패키지를 설치하여
직렬화 및 역직렬화를 진행하였다.
아래 내용은 게임 제작을 위한JSON 라이브러리 성능 비교 논문 에서 발췌한 내용이다.
PC와 Smart Phone 환경 모두 JsonUtility 가 LitJson 과 Newtonsoft.Json 보다 4~6배 정도 빠르다는 결과를 얻었다.
게임 제작 시에 주로 사용되는 JSON의 용도 중에 게임 데이터 저장 및 로드 하는 용도나 퀘스트 및 스토리 데이터 관리 용도와 같이 직렬화, 역 직렬화가 빈번하게 발생하고,
속도가 중요한 용도에는 JsonUtility를 사용하는 것이 효과적이다.
이전 포스팅을 작성할 때는,
를 공부하며, 다양한 직렬화 방법 중 한 가지를 배웠었다.
PC 와 SmartPhone 모두 JsonUtility 가 더 빠르다는 결과를 알게 되어
해당 방법으로 직렬화와 역직렬화 기능을 구현해보았다.
객체를 JSON 형식의 문자열로 변환하기 위해 사용한다.
JSON 데이터는 공백이나 들여쓰기를 포함하지 않는 간결한 형식으로 출력된다.
string json = JsonUtility.ToJson(data);
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);
}
JsonUtility , Newtonsoft.Json , LitJson 의 직렬화, 역직렬화 시간을 비교한 논문이 있다는 것이 매우 흥미로웠다.
앞으로 한 가지 기능을 여러 방법으로 구현할 수 있다면,
관련 논문 등을 통해 더 빠르거나 안전한 방법으로 개발할 수 있는 기능을 선택하도록 해야겠다.