1. Cloud Save란?

  • 플레이어 데이터를 클라우드에 저장해주는 Unity Gaming Services(UGS) 기능.
  • 장점:
    • 기기/플랫폼 간 동기화 (모바일, PC, 콘솔 어디서든 같은 데이터 사용 가능)
    • 데이터 유실 방지 (앱 삭제/기기 교체해도 계정만 있으면 데이터 복원 가능)
    • JSON 구조 관리 (Dictionary로 쉽게 키-값 저장)

2. 비용 정책

  • 데이터 저장 용량: 5GB 무료 제공
  • 읽기/쓰기 횟수: 각 100만 회 무료 제공
  • 그 이상부터 과금 (대규모 서비스 아니면 보통 무료 범위 내에서 충분)

3. 저장 정책 (어떻게/언제 저장할지)

  1. 빅브라더 모델 → 모든 행동 저장 (용량/호출 많아짐 → 비효율9=적)
  2. 중도 모델 (권장)
    • 강화, 구매, 던전 완료 등 중요 이벤트 시 저장
    • 창 열고 닫는 시점 등 데이터 변할 때 저장
    • 유휴 상태(Idle) 1분마다 저장
  3. 콘솔 모델 → 플레이어가 [저장하기] 누를 때만 저장

4. 데이터 종류

  • Player Data플레이어 개인의 데이터 (예: 인벤토리, 골드, 진행도)
  • Custom Data 공유 데이터 (예: 이벤트 정보, 랭킹, 공지사항)
CloudSaveService.Instance.Data.Player   // 개인 데이터 저장소
CloudSaveService.Instance.Data.Custom   // 공유 데이터 저장소

5. 설치 방법

CloudSaveService를 사용하기 위해서 Package Manager에서 Cloud Save 패키지를 설치하여야 합니다.

5. 데이터 저장 & 불러오기

public async Task Save(TestData testData)
    {
        var dataSave = new Dictionary<string, object>
        { 
            {"TestData", JsonUtility.ToJson(testData)}
        };
        await CloudSaveService.Instance.Data.Player.SaveAsync(dataSave);
        Debug.Log("데이터 저장 완료");
    }

 

키를 통해 데이터를 받아야 하므로 딕셔너리를 사용합니다.

    public async Task<TestData> Load()
    {
        var data = await CloudSaveService.Instance.Data.Player.LoadAsync(new HashSet<string>{ "TestData" });

        if (data.TryGetValue("TestData", out var item))
        {
            string json = item.Value.GetAsString(); // 아이템으로 반환된 값을 문자열로 변환
            
            TestData testData = JsonUtility.FromJson<TestData>(json);
            return testData;
        }
        return null;
    }

 

문제점: 저장해야 할 클래스가 늘어나면 메서드의 수도 증가합니다.

다양한 클래스에 대응 및 재사용성을 위해 제네릭을 사용하는게 좋습니다.

 

제네릭 저장 함수

public async Task Save<T>(string key, T data)
{
    string json = JsonUtility.ToJson(data);

    var datoSave = new Dictionary<string, object>
    {
        { key, json }
    };

    await CloudSaveService.Instance.Data.Player.SaveAsync(datoSave);
    Debug.Log("데이터 저장 완료");
}

await CloudSaveManager.Instance.Save("PlayerInfo", playerInfo);
await CloudSaveManager.Instance.Save("Inventory", inventory);
await CloudSaveManager.Instance.Save("StageProgress", stageProgress);

 

제네릭 불러오기 함수

public async Task<T> Load<T>(string key)
{
    var loadData = await CloudSaveService.Instance.Data.Player.LoadAsync(new HashSet<string> { key });

    if (loadData.TryGetValue(key, out var jsonData))
    {
        string json = jsonData.Value.GetAsString();
        T data = JsonUtility.FromJson<T>(json);
        return data;
    }

    return default;
}

PlayerInfo player = await CloudSaveManager.Instance.Load<PlayerInfo>("PlayerInfo");
Inventory inventory = await CloudSaveManager.Instance.Load<Inventory>("Inventory");

 

 

'Unity > UGS' 카테고리의 다른 글

[Unity] Analytics  (0) 2025.08.30
[Unity] Remote Config (원격 설정)  (2) 2025.08.27
[Unity] UGS로 로그인 기능 구현하기  (0) 2025.04.28

+ Recent posts