-
[TIL] 게임에서 데이터 저장하기(직렬화, 역직렬화)TIL 2024. 5. 31. 20:32
Serialization(직렬화) 와 Deserialization(역직렬화)
우리가 작성한 코드들은 메모리에 들어가고 메모리의 주소를 가진다.
주소는 각각 흩어져있는데 그런 흩어진 메모리 상의 값들을 정리해서 나열하는 것을 직렬화라고 한다.
이렇게 직렬화된 값들은 우리가 보기좋게 나열되게 된다.
반대로 이렇게 나열한 값을 프로그램이 다시 시작될 때 다시 되돌리는 것을 역 직렬화 라고한다.
직렬화를 해두고 나중에 역 직렬화를 해도된다.
이렇게 직렬화와 역직렬화를 통해 값을 저장하거나 서버와 통신할 때 사용할 수 있다.
PlayerPrefabs
유니티에서 제공하는 기본 설정을 저장하는 클래스이다.
이 데이터는 로컬 레지스트리에 저장되는데 보안에는 그렇게 좋지는 않은지 Unity에서 중요한 데이터를 저장할 때에는 PlayerPrefs를 사용하지 말라고 권장하고 있다.
따라서 PlayerPrefs는 털려도 상관없는 정보 예를 들어서 게임의 기본값 세팅 ex) 소리 설정, 화면 해상도 등
을 저장할 때 사용하면 좋을 것 같다.
예시코드
string key = "bestScore"; float best=0f; if (PlayerPrefs.HasKey(key)) //저장해둔 정보가 있다면 불러오기 { best= PlayerPrefs.GetFloat(key); } else //없다면 새로 만들어준다. { PlayerPrefs.SetFloat(key, time); }
- DeleteAll: 모든 키와 값을 삭제한다.
- DeleteKey: 지정된 키를 제거한다.
- GetFloat: 저장된 키에 해당하는 float 값을 가져온다.
- GetInt: 저장된 키에 해당하는 int 값을 가져온다.
- GetString: 저장된 키에 해당하는 string값을 가져온다.
- HasKey: PlayerPrefs에 지정된 키가 있으면 true를 반환하고, 아니라면 false를 반환한다.
- SetFloat : float값을 PlayerPrefabs에 저장한다.
- SetInt : int값을 PlayerPrefabs에 저장한다.
- SetString : string값을 PlayerPrefabs에 저장한다.
https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
CSV(Comma Separated Values)
엑셀에서 값을 설정하고 저장해서 게임에 세팅할 수 있다.
엑셀 파일을 저장할 때 CSV형태로 저장할 수 있고 , 로 값을 구분한다.
CSV와 CSV UTF-8형태로 저장하는게 있는대
CSV로 저장하게 되면 글자가 깨질 수도 있으니 UTF-8을 쓰는 것을 권장한다.
var csvData = Resources.Load<TextAsset>("CSVData");
유니티 Assets파일 안에 Resources라는 파일을 생성해주고 그 안에 CSV을 넣어주면
위에 있는 코드를 사용해서 파일을 불러올 수 있다.
이런식으로 엑셀의 표를 , 형태로 나눠서 값을 불러 올 수 있다.
이 CSV파일을 가져와서 사용할 때는 , 로 값을 나눠주는 파싱이 필요하다.
이렇게 CSV파일을 사용하게될 때 , 로만 나눠져서 보이기 때문에 어떤값인지
읽을수는 있지만 정보값이 많아질수록 해당하는 값이 어떤값인지 알기 어려워질수 있다.
그래서 읽고 쓰기 좋은 직렬화 방식을 사용하게 되었는데 주로
XML, Json, Yaml 을 사용한다고 한다.
공통적으로 Key : Value 형태로 되어있다.
XML(eXtensible Markup Language)
한 때는 XML로만 거의 사용했다고 한다.
1. 가장 외각이 루트 노드
2. 그 아래가 자식 노드
3. 가장 최하위 노드가 요소(앨리먼트) 이다.
사진을 보면 알겠지만 값을 작성하고나면 </ 노드 이름> 을 사용해서 꼭 닫아줘야한다.
C#에서 xml을 사용할 수 있는 기능이 탑제 되어 있고.
우리가 사용하는 유니티 엔진 또한 XML로 저장되고 있는 것을 확인할 수 있다.
참고로 Prefab 정보는 Yaml 로 저장되는 것을 열어보면 확인할 수 있다.
이를 통해서 유니티 또한 직렬화 데이터들의 집합이라는 것을 알 수 있다.
Json
디폴트가 되어있기 때문에 사용하기가 편리하고 최근에는 주로 Json을 쓴다고한다.
서버랑 통신할 때 자주 쓴다.
Json 라이브러리
Newtonsoft
LitJson
JsonUtility
전에도 Json에 관련해서 아래 작성해 둔 글이 있기 때문에 각각 라이브러리에 대한 설명은 생략하고
Unity에서 Json을 쓴다면 가장 속도가 빠른 JsonUtility 를 쓰는게 좋다고만 알아두면 좋을 것 같다.
https://gamjada.tistory.com/26
Json의 자세한 사용방법은 다음 특강때 정리하기로.....
'TIL' 카테고리의 다른 글
[TIL] 제작 관련 기능을 만들기 2 (1) 2024.06.04 [TIL] 제작 관련 기능을 만들기 1 (1) 2024.06.03 [TIL] 3D 프로젝트 정리 (1) 2024.05.30 [TIL] UGUI (0) 2024.05.29 [TIL] 유니티 숙련주차 3 (0) 2024.05.28