유니티와 Json
유니티에서 많은 데이터를 저장하기 위한 방법이 있을텐데
뭐 단순한 데이터 하나를 저장하려면 PlayerPrefs로 저장하겠지만 예를 들어서 플레이어의 이름, 레벨, 인벤토리, 아이디 등등 많은 데이터들이 존재할 것이다.
이것들을 PlayerPrefs로 저장한다면 로직상 구현하기 빡세고 관리하기 벅찰 것이다.
그래서 데이터를 직렬화와 역직렬화에 대한 것이랑 그 많은 데이터를 저장하는 방법을 알아보자
직렬화 : 많은 데이터를 저장 및 업로드(Save)
역직렬화 : 그 올린 데이터를 다운로드(Load)
먼저 PlayerPrefs를 정의해보자
//직렬화
string name = "HyeokJae";
int level = 8;
string job = "Fighter";
PlayerPrefs.SetString("SaveData",name + level + Fighter);
//Vector같은 경우에는 x,y,z를 따로 문자열로 저장
Vector3 pos;
PlayerPrefs.SetString("SavePos",$"{pos.x}, {pos.y}, {pos.z}");
//역직렬화
string data = PlayerPrefs.GetString("SaveData");
string[] datas = data.Split(", ");
string name = data[0];
int level = int.Parse(data[1]);
string job = data[2];
string loadPos = PlayerPrefs.GetString("SavePos");
Vector3 pos = new Vector3(float.Parse(pos[0]),float.Parse(pos[1]),float.Parse(pos[2]));
하지만 데이터를 불러오기 비효율적이다.
그러나 직렬화로 데이터를 관리하는 파일이 3가지 있는데
XML, JSON, YAML
여기서 JSON으로 데이터를 관리하고 저장하는 방법을 알아보자.
(다른 방법도 있지만 다루기에는 너무 어렵고 복잡할 것이다....)
JSON은 통신할때 많이 사용되는 파일 확장자이다.
키와 값을 한쌍으로 이루는 딕셔너리 형태로 데이터를 관리한다.
{string 키값 : 데이터 (int, float, string 등 리스트 형태도 저장할 수 있다.)}
유니티에서 JSON으로 데이터를 저장하기 위해서는 데이터를 public이나 [SerializeField]로 설정해야 하고 class같은 경우에는 [System.Serializable]로 설정해야 한다. 그리고 Json에는 반드시 변동된 값을 저장해야 한다.
(아이디는 고정으로 되어 있지만 통신할 경우에 식별을 위해, 인벤, 레벨, 경험치 이런 것들이 Json에 저장할 수 있다.)
JSON으로 저장 가능한 자료형 (int, float, string, List, class, Vector2 or 3, Quaternion)
(단 dictionary, delegate, static, const 같은 형태는 저장이 안된다)
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class Character : MonoBehaviour
{
//Json으로 저장하는 예제
public UserData data;
private void Update()
{
if(Input.GetKeyDown(KeyCode.Q)) //데이터 세이브
{
// UserData형식으로 json에 저장 (var는 어떤 형식을 가져올지 모르니까)
var json = JsonUtility.ToJson(data);
Debug.Log(Application.persistentDataPath);
// 함수에서 저장할 파일의 경로, json으로 하면 저장 뚝딱이다.
File.WriteAllText(Application.persistentDataPath + "/UserData.txt", json);
}
if(Input.GetKeyDown(KeyCode.W)) //데이터 로드
{
var jsonData = File.ReadAllText(Application.persistentDataPath + "/UserData.txt");
// 불러온 데이터가 UserData로 저장되어 있으니 당연히 data로 저장한다.
data = JsonUtility.FromJson<UserData>(jsonData);
}
}
}
//데이터를 저장할 클래스와 속성
[System.Serializable]
public class UserData
{
public string nickname;
public int lv;
public float hp;
//public Transform transform;
public Vector3 pos;
public Quaternion rot;
public List<string> friends = new List<string>();
public List<Inventory> inventories = new List<Inventory>();
}
[System.Serializable]
public class Inventory
{
public int size;
public List<int> itemids = new List<int>();
}
그리고 한가지 더 SO같은 경우에는 저장 용도로 사용하면 안된다.
그렇게 하길 원한다면 SO를 직렬화 시켜서라도 저장해본다.
JSON파일의 보완성을 지키려면 [Json → 암호화 → 비암호화 → 역직렬화 방식] 으로 하면 된다. (오정호 튜터님)
by 스파르타 코딩클럽
'개발 TIL' 카테고리의 다른 글
6/3 부트캠프 개발 TIL (Nav Mesh 활용) (0) | 2024.06.03 |
---|---|
5/31 부트캠프 개발 TIL (Nav Mesh) (0) | 2024.05.31 |
5/29 부트캠프 개발 TIL (아이템 효과) (0) | 2024.05.29 |
5/28 부트캠프 개발 TIL (물리 가속도와 마찰) (0) | 2024.05.28 |
5/27 부트캠프 개발 TIL (2D Sprite) (0) | 2024.05.27 |