JSON(JavaScript Object Notation)은 데이터를 교환하고 저장하기 위한 텍스트 기반 데이터 교환 표준이다.
사실 이러한 정의보다, 오늘 포스팅할 'JSON 파일을 이용해 Unity에서 데이터를 저장하고 불러오는 방법'을 알아보기 위해서는 다음 사항을 숙지하는 것이 더 중요하다.
1. JSON으로 만들 코드는 반드시 클래스 형식이어야 한다.
2. Class를 string 형식의 JSON 파일로 변환하고, 해당 파일을 저장한 후, 다시 string 형식을 1.에서 정의한 class 형식으로 변환시켜 데이터를 복구한다.
이 포스팅에서는 플레이어 캐릭터의 좌표, 회전값, 레벨을 json 파일로 저장하고, 다시 불러오는 기능을 구현한 예제를 통해 JSON을 이용하여 데이터를 저장하고 불러오는 방식을 알아본다.
1. JSON으로 변환할 Data Class 만들기
using UnityEngine;
public class Data
{
public Vector3 position;
public Quaternion rotation;
public int level;
public Data(Vector3 position, Quaternion rotation, int level)
{
this.position = position;
this.rotation = rotation;
this.level = level;
}
}
위와 같이 JSON으로 변환해서 저장할 data들을 보관하는 class를 만든다. 여기서는 위치, 회전값, 레벨을 저장하는 class를 만들었다.
2. 저장하기
public void Save()
{
Data dataToSave = new Data(transform.position, transform.rotation, _level);
string jsonData = JsonUtility.ToJson(dataToSave);
File.WriteAllText(_path+_fileName, jsonData);
}
JsonUtility.ToJson 함수는 class intance를 JSON 파일로 변환한다.
File.WriteAllText 함수는 해당 JSON 파일을 지정된 위치에 저장한다.
_path = Application.persistentDataPath+"/";
_fileName = "saveFile";
위 예제는 위와 같이 JSON 파일을 저장할 경로를 지정해 주었다. 참고로, (Window에서의) Application.persistentDataPath는 %userprofile%\AppData\LocalLow\<companyname>\<productname> 경로를 의미한다.
나는 이 함수를 Save 버튼을 클릭하면 실행되도록 해 두었으므로,
여기서 Save 버튼을 누르면,
해당 위치에 saveFile이 생성된다.
3. 불러오기
불러오기는 저장의 역순으로, 해당 경로에서 JSON 파일을 읽어와, 해당 string을 다시 class로 변환하는 작업이다.
public void Load()
{
string loadedJson = File.ReadAllText(_path+_fileName);
Data loadedData = JsonUtility.FromJson<Data>(loadedJson);
ApplyLoadedData(loadedData);
}
void ApplyLoadedData(Data data)
{
transform.position = data.position;
transform.rotation = data.rotation;
_level = data.level;
positionText.text = $"{transform.position}";
rotationText.text = $"{transform.rotation}";
levelText.text = $"{_level}";
}
경로에 저장되어 있는 파일을 읽어올 때 File.ReadAllText 함수가, 해당 JSON을 다시 class 형식으로 변환할 때 JsonUtility.FromJson 함수가 사용된다.
함수 이름이 굉장히 직관적으로 사용되었기 때문에(ToJson - FromJson, WriteAllText - ReadAllText) 쉽게 이해할 수 있었다.
이제 이 함수를 Load 버튼을 눌렀을 때 작동되도록 설정해 두면, 데이터를 읽어와서 복구하는 기능을 구현할 수 있다.
'게임개발 > Unity' 카테고리의 다른 글
[Unity] GameObject의 이동(기본) (0) | 2024.06.10 |
---|---|
[Unity] ScriptableObject (0) | 2024.06.09 |
[Unity] 게임오브젝트의 회전 (1) | 2024.06.08 |
[Unity] Unity Event (0) | 2024.06.07 |
[Unity-UI] Canvas - Render Mode (1) | 2023.11.12 |