Unity-Json으로 상점 데이터 구현하기

dumdumer·2023년 8월 23일
0

Unity

목록 보기
2/3

Json을 사용해 상점 데이터를 Save & Load 해보자.

현재 진행 중인 프로젝트에서 필요한 상점이 가지는 정보는 다음과 같다.

  1. 해머 아이템 (해머는 소모품으로 한 번 구매 후 사용하면 다시 구매할 수 있다.)
  2. 방어선 증가 아이템 (1번만 구매 가능. 9칸 → 10칸)
  3. 캐릭터 선택 슬롯 증가 아이템 (LV 4까지 존재. 6칸→7칸, 7→8, 8→9, 9→10)
  4. 캐릭터 레벨 업그레이드

위 요소들을 저장할 데이터 형식은 다음과 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 포맷으로 상호 전환을 할 수 있다.

  • JsonUtility.ToJson(object obj) : object 데이터를 json 포맷의 문자열로 변환한다.

그리고 생성된 문자열을 지정한 위치에 저장한다.

  • File.WriteAllText(string path, string contents) : 새 파일을 만들고 contents를 해당 파일에 작성한다. 만약 path가 존재한다면 그 파일을 덮어쓴다.
{"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()를 찍어보면 다음과 같이 결과가 나오는 것을 볼 수 있다.

profile
tik tok

0개의 댓글