현재 진행 중인 프로젝트에서 필요한 상점이 가지는 정보는 다음과 같다.
- 해머 아이템 (해머는 소모품으로 한 번 구매 후 사용하면 다시 구매할 수 있다.)
- 방어선 증가 아이템 (1번만 구매 가능. 9칸 → 10칸)
- 캐릭터 선택 슬롯 증가 아이템 (LV 4까지 존재. 6칸→7칸, 7→8, 8→9, 9→10)
- 캐릭터 레벨 업그레이드
위 요소들을 저장할 데이터 형식은 다음과 Json으로 변환할 클래스로 나타내었다.
[System.Serializable]
public class ShopData
{
public bool hasHammer; // 구매 여부
public bool hasSeatExpansion; // 구매 여부
public int slotLevel;
public CharacterLvls[] characterLvls; // 캐릭터 별 레벨
public ShopData()
{
hasHammer = false;
hasSeatExpansion = false;
slotLevel = 0;
characterLvls = null;
}
}
[System.Serializable]
public struct CharacterLvls
{
public string characterName;
public int level;
}
이제 위와 동일 데이터 구조를 가진 json 스크립트를 불러오는 기능을 구현해보자.
먼저 위 클래스를 json으로 변환하려면 스크립트 직렬화가 가능한 클래스여야 한다.
json 스크립트 직렬화는 System 네임스페이스에서 제공하는 "[Serializable]" 명령어로 사용자 정의한 클래스를 직렬화 할 수 있다.
using System.IO;
...
public class DataManager : MonoBehaviour
{
static string shopDataPath = Application.dataPath +
"/Resources/Data/shopData.json";
...
public static void SaveShopData(ShopData shopData)
{
// json 형태로 된 문자열 생성
string json = JsonUtility.ToJson(shopData);
// 파일 생성 및 저장
File.WriteAllText(shopDataPath, json);
}
...
}
위 코드에서 사용하는 JsonUtility는 무엇인가?
JsonUtility는 유니티 엔진에서 제공하는 클래스로, 이 클래스의 함수를 사용해 유니티 오브젝트를 json 포맷으로 상호 전환을 할 수 있다.
그리고 생성된 문자열을 지정한 위치에 저장한다.
{"hasHammer":false,"hasSeatExpansion":false,"slotLevel":0,"characterLvls":[]}
위와 같이 json 파일이 생성되었다.
이제 Json 형식으로 저장했으니 그것을 불러오는 것도 구현해보자.
using System.IO;
...
public class DataManager : MonoBehaviour
{
...
public static ShopData GetShopData()
{
ShopData shopData = new ShopData();
if (File.Exists(shopDataPath))
{
string jsonString = File.ReadAllText(shopDataPath);
shopData = JsonUtility.FromJson<ShopData>(jsonString);
}
else
{
SaveShopData(shopData);
}
return shopData;
}
...
}
먼저 File.Exist(path)를 통해 지정된 위치에 데이터가 있는 지 확인하고,
파일이 있다면, Json 파일을 읽어 문자열로 가져온다.
string File.ReadAllText(string path); // 해당 위치에 있는 파일을 읽어 문자열로 반환한다.
그리고 가져온 문자열을 JsonUtility의 함수를 사용해 같은 데이터 구조의 객체에 대입해준다.
T FromJson<T>(string json); // json 포맷의 데이터를 동일한 데이터 구조의 오브젝트로 생성한다.
❗주의해야 할 것은, json 파일에 저장된 key 이름과 value의 타입이 생성하려는 클래스의 구조와 같아야 한다.
public class ShopManager : ShopBase
{
ShopData shopData;
...
void Start()
{
shopData = DataManager.GetShopData();
Debug.Log("hasHammer : " + shopData.hasHammer);
Debug.Log("hasSeatExpansion : " + shopData.hasSeatExpansion);
Debug.Log("slotLevel : " + shopData.slotLevel);
Debug.Log("CharacterLvls : " + shopData.characterLvls);
...
}
}
이제 데이터를 사용할 ShopManager 클래스에서 Debug.Log()를 찍어보면 다음과 같이 결과가 나오는 것을 볼 수 있다.