Table of Contents
Unity의 JsonUtility를 사용하다보면
커스텀 클래스를 쉽게 JSON으로 파싱할 수 있지만
원하는 변수 몇개만 JSON으로 파싱해주는 기능이나,
파싱 이후에 변수룰 추가, 삭제, 수정을 할 수 있게해주는 기능이 없다.
그래서 이런식으로 한글자 한글자 입력해서 JSON으로 만들어 쓰다가
$"{{\"account_uuid\": \"{account_uuid}\", \"email\": \"{email}\",
\"password\": \"{hashed_password}\", \"team\": \"{team}\"}}";
너무 불편해서 찾아낸 방법이다.
이 에셋을 사용한다. (Newtonsoft Json 라이브러리라고도 알려져 있다)
에셋을 그냥 프로젝트에 임포트하기만 하면 된다.
다만 Newtonsoft Json라이브러리를 사용하는 에셋들이 많다보니
어셈블리가 중복돼서 에러가 날수는 있다.
아래는 사용의 예시이다.
using System.IO;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class JsonSaveLoad : MonoBehaviour
{
public void Save()
{
// key-value 사용
JObject savedata = new JObject(); // JObject 인스턴스 생성
savedata["key-name"] = "value-data"; // key-value 삽입
savedata["anyname"] = 1f; // int, float, string
savedata["is-save"] = true; // bool 등 다양한 자료형 사용 가능
// json에서 배열 사용하기
JArray arraydata = new JArray(); // JArray 인스턴스 생성
for (int i = 0; i < 5; i++)
{
// 랜덤한 값을 추가한다.
// C++에서 사용하는 vector의 push_back과 같다고 보면 된다.
arraydata.Add(Random.Range(0.0f, 10.0f));
}
savedata["arraydata"] = arraydata; // 위에서 만든 JArray를 대입.
// 다른 방법으로 JArray 사용하기
savedata["newarr"] = new JArray(); // 새로운 key에 value로 JArray 할당.
for (int i = 0; i < 5; i++)
{
((JArray)savedata["newarr"]).Add(Random.Range(0, 50)); // JArray 변수를 만들어서 축약 가능
}
// json 형식을 value로 사용하기
savedata["parent"] = new JObject(); // key를 지정하고 value에 new JObject()를 대입.
savedata["parent"]["child1"] = 123;
savedata["parent"]["child2"] = 456;
// class를 json으로 변환하기
SaveData s = new SaveData(); // 인스턴스화 시키고 적당히 데이터를 입력.
s.id = 0;
s.namelist.Add("komastar");
s.namelist.Add("kintaro");
savedata["class-savedata"] = JToken.FromObject(s); // 파싱.
// 파일로 저장
string savestring = JsonConvert.SerializeObject(savedata, Formatting.Indented); // JObject를 Serialize하여 json string 생성
File.WriteAllText(Application.persistentDataPath + "/savedata.json", savestring); // 생성된 string을 파일에 쓴다
}
public void Load()
{
// 불러오기는 저장의 역순
string loadstring = File.ReadAllText(Application.persistentDataPath + "/savedata.json"); // string을 읽음
JObject loaddata = JObject.Parse(loadstring); // JObject 파싱
// key 값으로 데이터 접근하여 적절히 사용
Debug.Log("key-value 개수 : " + loaddata.Count);
Debug.Log("----------------------------");
Debug.Log(loaddata["class-savedata"]);
Debug.Log("----------------------------");
JArray loadarray = (JArray)loaddata["arraydata"];
for (int i = 0; i < loadarray.Count; i++)
{
Debug.Log(loadarray[i]);
}
Debug.Log("----------------------------");
foreach (var item in loaddata["newarr"])
{
Debug.Log(item);
}
Debug.Log("----------------------------");
Debug.Log(loaddata["newarr"]);
}
}
public class SaveData
{
// 변수 이름이 key값으로 사용된다.
public int id;
[JsonProperty("name-list")] // 프로퍼티 이름을 지정하면 변수 이름 대신 key값으로 사용된다.
public List<string> namelist; // "namelist" : {} 대신 "name-list" : {} 으로 사용됨.
public SaveData()
{
id = 0;
namelist = new List<string>();
}
}
/*
{
"key-name": "value-data",
"anyname": 1.0,
"is-save": true,
"arraydata": [
3.138103,
6.43384361,
0.0607228279,
5.9034543,
6.343808,
0.208146572,
6.17789,
8.661151,
9.782631,
4.389159
],
"newarr": [
0,
29,
0,
34,
26
],
"parent": {
"child1": 123,
"child2": 456
},
"class-savedata": {
"id": 0,
"name-list": [
"komastar",
"kintaro"
]
}
}
*/
출처:
'Unity > C#' 카테고리의 다른 글
[Unity] Hitbox와 Hurtbox시스템 (0) | 2022.06.20 |
---|---|
[Unity] Renderer의 Materials 동적 변경 (0) | 2022.06.08 |
[Unity] Raycasthit.transform과 Raycasthit.collider.transform (0) | 2022.05.09 |
[Unity] 길찾기 에셋을 활용한 Wander구현 (0) | 2022.02.24 |
[Unity] FSM패턴 (0) | 2022.02.22 |