오브젝트의 정보를 'key', 'value' 로 사람이 읽을 수 있는 형태로 저장해서 전달할 수 있는 포멧으로, 아래 이미지에서 category 라는 key에 생활이라는 value를 저장하는 형식
vaule에는 array(배열)도 담을 수 있다.
Unity 오브젝트에서 JSON 데이터를 저장하는 방법
1) 게임 오브젝트에 스크립트를 생성하여 붙여준다
2) 플레이어 컨트롤러 클래스와 플레이어 데이터 클래스를 분리하여 코드를 작성
분리하지 않으면 컨트롤러 클래스가 상속받고 있는 MonoBehavior를 비롯한 불필요한 내용까지 함께 저장하게 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 컨트롤러 클래스와 데이터 클래스 분리
public class PlayerController : MonoBehaviour
{
/**PlayerController로서 필요한 변수와 메서드가 있다 **/
public PlayerData playerData;
}
public class PlayerData
{
public string name;
public int age;
public int level;
public bool isDead;
public string[] items;
}
3) Serializable 처리
유니티로 돌아오면 Public 선언을 했음에도 PlayerData를 Inspector창에서 편집이 안된다.
PlayerData클래스가 Serializable 처리가 안되어 있기 때문.
클래스 위에 아래와 같이 Serializable 속성을 부여해주면 유니티 상에서 편집이 가능하게 된다.
MonoBehavior를 상속한 PlayerController 클래스는 Serializable 처리가 되어있기 때문에 적지 않아도 되지만,
그 외의 클래스는 이와 같은 Serializable 처리가 필요하다.
[System.Serializable]
public class PlayerData
{
public string name;
public int age;
public int level;
public bool isDead;
public string[] items;
}
4) JSON Utility 를 활용해 오브젝트의 데이터를 JSON 파일로 옮겨보자
Inspector창의 PlayerData에 데이터를 넣은 후, 이를 JSON 파일로 옮겨보자.
유니티에는 JSON Utility 라는 것이 있어서, 오브젝트의 데이터를 JSON파일에 한번에 손쉽게 옮길 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO; // 저장 등 파일 관리를 위해 추가
// 컨트롤러 클래스와 데이터 클래스 분리
public class PlayerController : MonoBehaviour
{
/**PlayerController로서 필요한 변수와 메서드가 있다 **/
public PlayerData playerData;
[ContextMenu("To Json Data")] // 컴포넌트 메뉴에 아래 함수를 호출하는 To Json Data 라는 명령어가 생성됨
void SavePlayerDataToJson()
{
// ToJson을 사용하면 JSON형태로 포멧팅된 문자열이 생성된다
string jsonData = JsonUtility.ToJson(playerData);
// 데이터를 저장할 경로 지정
string path = Path.Combine(Application.dataPath, "playerData.json");
// 파일 생성 및 저장
File.WriteAllText(path, jsonData);
}
}
[System.Serializable]
public class PlayerData
{
public string name;
public int age;
public int level;
public bool isDead;
public string[] items;
}
컴포넌트 메뉴에서 "To Json Data" 메뉴를 실행시키면, 입력한 값들이 오른쪽 사진과 같이 playerData.json 파일로 생성이 된다.
5) JSON 데이터 예쁘게 정렬하기
파일을 확인해보면 위와 같이 한줄로 작성되어 가시성이 떨어지는 것을 알 수 있다. ToJson 프로퍼티에 prettyprint 값을 true로 지정해주면 아래와 같이 깔끔하게 파일이 생성된다.
JSON 파일 정보를 불러와 적용하는 방법
1) ContextMenu에 Load Player Data From Json 함수를 추가
[ContextMenu("From Json Data")]
void LoadPlayerDataFromJson()
{
// 데이터를 불러올 경로 지정
string path = Path.Combine(Application.dataPath, "playerData.json");
// 파일의 텍스트를 string으로 저장
string jsonData = File.ReadAllText(path);
// 이 Json데이터를 역직렬화하여 playerData에 넣어줌
playerData = JsonUtility.FromJson<PlayerData>(jsonData);
}
2) From Json Data 를 실행시켜주면
아래와 같이 수정된 데이터가 불러와 오브젝트에 적용된다.
사실 데이터를 JSON 파일로 옮기는 메뉴나 버튼을 PlayerController 내부에 붙이는 것은 바람직하지 않다.