-
유니티 에셋 이지세이브로 진짜 쉽게 데이터 저장 / Unity Asset Easy Save Data Save and Load유니티 2023. 9. 21. 14:12
이지세이브의 특징
이지세이브는 데이터의 저장과 불러오기를 편리하게 해주는 기능입니다.
int, string 등은 물론 클래스나 배열, 리스트도 JSON으로 암호화해서 저장할 수 있습니다.
해당 이지세이브 에셋을 구매 후 유니티에 임포트하신 뒤 사용하시면 됩니다.
기본적인 저장과 불러오기
using UnityEngine; public class Test : MonoBehaviour { void Start() { string profile = "Hello"; ES3.Save("profile", profile); if (ES3.KeyExists("profile")) { string loadProfile = ES3.Load<string>("profile"); print(loadProfile); } } }
저장시 키는 string이고, 값은 저장하고 싶은 값입니다.
불러올 때 키가 존재하는지 체크 후 불러오는데 제네릭 형태이므로 꺽쇠안에 형식을 적어줍니다.
Window - Easy Save 3 - Tools - Open Persistent Data Path에 SaveFile.es3로 저장이 되어있을 겁니다.
{ "profile" : { "__type" : "string", "value" : "Hello" } }
열어보니 JSON 형태로 저장이 되어있습니다.
다시 이지세이브 윈도우로 가서 Clear Persistent Data Path를 눌러모든 폴더내 저장된 이지세이브 파일을 지웁니다.
Clear PlayerPrefs는 유니티 내장된 PlayerPrefs 저장된 정보를 지웁니다.
AES 암호화
Easy Save 윈도우 - Settings - Encryption을 None에서 AES로 변경합니다.
Encryption Password에 암호를 입력합니다.
다시 게임을 플레이시켜 저장과 불러오기를 해봅시다.
s神 Q&=?|?榛?i渲=7i쏨6q녙哺}곚B??孱=?꾌뻬?zV쭛??촁:|Z?쐯?`ㄿc&?쟢?7?!댺웶2
이렇게 알수 없는 문자로 변했습니다.
암호를 알지 않는 한 디코딩을 하기가 매우 어렵습니다.
심지어 저장할때마다 똑같은 걸 저장하여도 내용이 통째로 바뀝니다.
내부적으로 시간값까지 넣은 게 아닌가 싶습니다.
파일 분할
using UnityEngine; public class Test : MonoBehaviour { void Start() { string profile = "Hello"; ES3.Save("profile", profile, "SaveFile_Profile.es3"); if (ES3.KeyExists("profile", "SaveFile_Profile.es3")) { string loadProfile = ES3.Load<string>("profile", "SaveFile_Profile.es3"); print(loadProfile); } } }
한 파일에 너무 많은 데이터를 저장하면 저장 시간이 오래 걸릴 수 있기에
파일 분할도 적절히 해야 합니다.
저장과 불러오기 뒤 매개변수로 파일이름.es3를 적어주면 됩니다.
그리고 지우지않고 게임을 한번 플레이 시켜주면 새로운 파일이 생겼습니다.
최적화하여 저장과 불러오기
using UnityEngine; [System.Serializable] public class Profile { public string name; public int age; public Profile(string name, int age) { this.name = name; this.age = age; } public Profile() { } } public class Test : MonoBehaviour { [SerializeField] Profile[] loadProfiles; void Start() { Profile[] profiles = new Profile[2] { new Profile("aa", 20), new Profile("bb", 30) }; System.DateTime nowTime = System.DateTime.Now; { ES3File es3File = new ES3File("SaveFile_Profile.es3"); es3File.Save("profiles", profiles); es3File.Save("nowTime", nowTime); es3File.Sync(); } { ES3File es3File = new ES3File("SaveFile_Profile.es3"); if (TryLoad("profiles", es3File, out Profile[] _profiles)) loadProfiles = _profiles; if (TryLoad("nowTime", es3File, out System.DateTime _nowTime)) nowTime = _nowTime; print(nowTime); } } bool TryLoad<T>(string key, ES3File file, out T t) { if (file.KeyExists(key)) { t = file.Load<T>(key); return true; } t = default; return false; } }
데이터의 저장과 불러올 시 주의할 점도 있습니다.
클래스에는 public Profile() { } 이와같이 빈 생성자가 있어야 합니다.
간혹 저장이 안되는 경우가 있기 때문입니다.
또 저장시에 Transform같이 참조하는 형태는 저장이 불가합니다.
여러개를 동시에 저장할때 직렬로 파일 열어서 저장하고 다음줄에 파일 열어서 저장하고 하면 성능이 좋지 않습니다.
그러므로 ES3File의 인스턴스를 만든 뒤 인스턴스에 저장할 키와 값을 쭉 쓴 후
마지막에 Sync 해주면 한번에 저장이 됩니다.
불러올때는 존재하는지 체크하고 불러오기가 번거롭기에
커스텀한 TryLoad함수를 만들어 if 문에서 체크와 값을 불러오기까지 되게 합니다.
'유니티' 카테고리의 다른 글