1. Cloud Save란?
- 플레이어 데이터를 클라우드에 저장해주는 Unity Gaming Services(UGS) 기능.
- 장점:
- 기기/플랫폼 간 동기화 (모바일, PC, 콘솔 어디서든 같은 데이터 사용 가능)
- 데이터 유실 방지 (앱 삭제/기기 교체해도 계정만 있으면 데이터 복원 가능)
- JSON 구조 관리 (Dictionary로 쉽게 키-값 저장)
2. 비용 정책
- 데이터 저장 용량: 5GB 무료 제공
- 읽기/쓰기 횟수: 각 100만 회 무료 제공
- 그 이상부터 과금 (대규모 서비스 아니면 보통 무료 범위 내에서 충분)
3. 저장 정책 (어떻게/언제 저장할지)
- 빅브라더 모델 → 모든 행동 저장 (용량/호출 많아짐 → 비효율9=적)
- 중도 모델 (권장)
- 강화, 구매, 던전 완료 등 중요 이벤트 시 저장
- 창 열고 닫는 시점 등 데이터 변할 때 저장
- 유휴 상태(Idle) 1분마다 저장
- 콘솔 모델 → 플레이어가 [저장하기] 누를 때만 저장
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 |