유니티에서 기기에 로컬 데이터 저장소를 만들어 필요한 데이터를 저장할 수 있습니다. 이곳에 저장된 데이터는 앱이 업데이트되어도 바뀌지 않습니다. 중요한 데이터라면 서버에 저장해야겠지만 로컬에 데이터를 저장하는 것이 필요한 경우가 있습니다. 오프라인에서 앱을 사용해야 하는 경우나 비교적 중요하지 않은 간단한 설정(앱의 음량 설정 등)은 로컬에 저장하는 것이 그 예시입니다.
JSON파일을 스크립트로 가져오기
데이터를 관리할 때 JSON 데이터 포멧을 자주 사용합니다. 아래는 JSON 데이터의 예시입니다.
{
"userString": "NewBie",
"userInteger": 1000,
"userArray": [2, 3, 4, 12, 13, 14, 22, 23],
}
유니티에서 제공하는 JSONUtility 클래스를 사용하면 JSON 포맷과 C# 객체 사이에 서로 상호 전환할 수 있습니다. 만약 위 JSON 데이터를 직렬화하여 스크립트에 객체 형태로 가져오려면 아래와 같이 클래스 구조를 만들고 데이터를 로드해야 합니다.
// UserData.cs
[Serializable]
public class UserData
{
// JSON 키값과 변수명이 정확히 일치해야 한다.
public string userString;
public int userInteger;
public int[] userArray;
}
// DataManager.cs
public class DataManager : MonoBehaviour
{
public UserData userData;
void Start()
{
// path는 로드를 하려는 JSON 파일이 저장된 경로이다.
// 유니티에서는 default로 Resources/ 에서 경로가 시작된다.
TextAsset JSONFile = Resources.Load<TextAsset>(path);
UserData userData = JsonUtility.FromJson<UserData>();
}
}
만약 JSON이 객체의 배열 형태라면(즉, 객체 안의 객체라면) 해당 객체를 따로 직렬화 해야한다.
// Animal.json
{
"animals":[
{ "id": 1, "name": "dog" },
{ "id": 2, "name": "cat" }
]
}
// Animal.cs
public class Animal
{
public int id;
public string name;
}
public class Animals
{
// 역시나 key값을 정확하게 일치시켜주어야 한다.
public Animal[] animals;
}
로컬 기기에 JSON 데이터 저장하고 불러오기
각 기기에 데이터가 저장되는 경로는 유니티 공식 문서에 상세히 설명되어 있습니다. 우리는 스크립트 상에서 이 경로를 string으로 아래와 같이 손쉽게 받아올 수 있습니다.
string filePath = Application.persistentDataPath + "/fileName.json"
C#의 System.IO File 클래스를 사용하면 쉽게 해당 경로에 파일을 저장하고 불러올 수 있습니다. 사용자 기기에 JSON 파일을 저장하고, 그 파일을 다시 불러오는 함수는 아래와 같이 만들어 보았습니다.
public class DataManager {
// ... Some Code ...
#region Save & Load
string _path = Application.persistentDataPath + "/fileName.json";
public void SaveGame()
{
// myObject에는 위 예시 userData와 같은 object가 들어갑니다.
string jsonStr = JsonUtility.ToJson(myObject);
File.WriteAllText(_path, jsonStr);
Debug.Log($"Save Completed : {_path}");
}
public bool LoadGame()
{
if (File.Exists(_path) == false)
{
Debug.Log("세이브 파일이 없어 새로 파일을 만듭니다");
// Some Code...
return false;
}
string fileStr = File.ReadAllText(_path);
MyClass data = JsonUtility.FromJson<MyClass>(fileStr);
if (data != null)
{
// 불러온 데이터를 필요한 곳에 저장...
}
Debug.Log($"Data Loaded : {_path}");
return true;
}
#endregion
}
서버가 없을 때 위와 같이 DataManager 클래스에서 Save와 Load 로직을 관리하여 로컬 저장소가 서버인 것처럼 파일로 구현해둘 수 있습니다. 이렇게 해둘 경우 추후 서버와 통신해야 하는 코드가 생겼을 때 코드를 수정하기가 수월해집니다.
개발 단계에서 유니티에서 스크립트를 실행하면 PC에도 (로컬에) 저장이 됩니다. 이 경로에 저장된 데이터의 경우 삭제뿐만 아니라 조작이 자유롭기 때문에 중요한 정보는 저장하지 말아야 합니다.
참고 문서
https://docs.unity3d.com/kr/2021.1/Manual/JSONSerialization.html
https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html
'Unity' 카테고리의 다른 글
[Unity] 클래시 로얄처럼 모바일 해상도 대응하는 방법 (0) | 2022.10.02 |
---|---|
[Unity] 픽셀 아트에 필요한 세팅 (2) 폰트 설정 (0) | 2022.10.01 |
[Unity] 픽셀 아트에 필요한 세팅 (1) 기본 설정 (3) | 2022.09.30 |
[Unity] VSCode에서 Debugger 사용하기(Deprecated 되었지만 사용 가능!) (0) | 2022.09.29 |
[Unity] 모바일 해상도 대응을 위한 UI 레이아웃 (2) (1) | 2022.09.28 |
최근댓글