Unity에서 Cloud Save 사용
본 기술 자료에는 Cloud Save SDK 3.0에 관한 예제가 포함되어 있습니다.
일반적인 워크플로
Unity 내의 정규 C# 스크립트에서 Cloud Save SDK를 호출할 수 있습니다. Unity의 스크립팅에 관한 자세한 내용은 스크립트 생성 및 사용을 참고하십시오.
- Unity 내에서 C# MonoBehaviour 스크립트를 생성합니다. 스크립트 생성 및 사용을 확인합니다.
- 스크립트 내에서 Unity Authentication 서비스를 구성합니다.
- 스크립트 내에서 Cloud Save SDK에 호출을 추가합니다.
- 새로 만든 스크립트를 게임 오브젝트에 연결합니다. 스크립트 생성 및 사용 페이지를 방문합니다.
- Play를 선택하여 프로젝트를 실행하고 Cloud Save를 실제로 경험해 봅니다.
MonoBehaviour 스크립트에 다음 네임스페이스를 포함하여 Cloud Save 클라이언트를 사용합니다.
using Unity.Services.CloudSave;
제공되는 CloudSaveSample
스크립트는 인증과 서비스 초기화, Cloud Save 클라이언트 사용, 중요한 async
개념을 보여 줍니다. Unity에서 Package Manager > Cloud Save > Samples를 선택하여 샘플을 확인할 수 있습니다.
Cloud Save 서비스에서는 플레이어별로 분당 600개의 요청 비율 제한을 적용합니다.
항목 저장
API 클라이언트 SaveAsync
메서드로 항목을 저장합니다.
public async void SaveSomeData()
{
var data = new Dictionary<string, object>{{"key", "someValue"}};
await CloudSaveService.Instance.Data.Player.SaveAsync(data);
}
항목 가져오기
API 클라이언트 LoadAsync
메서드를 통해 필요에 따른 일련의 키를 전달하여 항목을 가져올 수 있습니다.
public async void LoadSomeData()
{
Task<Dictionary<string, Item>> savedData = await CloudSaveService.Instance.Data.Player.LoadAsync(new HashSet<string>{"key"});
Debug.Log("Done: " + savedData["key"]);
}
항목 삭제
API 클라이언트 DeleteAsync
메서드를 사용하여 항목을 삭제합니다.
public async void DeleteSomeData()
{
await CloudSaveService.Instance.Data.Player.DeleteAsync("key");
}
키 및 메타데이터 목록 가져오기
API 클라이언트 ListAllKeysAsync
메서드를 사용하여 플레이어의 키 목록을 가져옵니다.
public async void RetrieveKeys()
{
Task<List<ItemKey>> keys = await CloudSaveService.Instance.Data.Player.ListAllKeysAsync();
for (int i = 0; i < keys.Count; i++)
{
Debug.Log(keys[i]);
}
}
Unity Dashboard를 사용하여 개별 플레이어의 데이터를 볼 수 있습니다.
플레이어 파일을 바이트 배열로 가져오기
API 클라이언트 LoadBytesAsync
메서드를 사용해 플레이어 파일을 바이트 배열로 가져옵니다.
public async void GetPlayerFileAsByteArray()
{
byte[] file = await CloudSaveService.Instance.Files.Player.LoadBytesAsync("fileName.csv");
}
플레이어 파일을 스트림으로 가져오기
API 클라이언트 LoadStreamAsync
메서드를 사용해 플레이어 파일을 스트림으로 가져옵니다.
public async void GetPlayerFileAsStream()
{
Stream file = await CloudSaveService.Instance.Files.Player.LoadStreamAsync("fileName.csv");
}
플레이어 파일 메타데이터 가져오기
API 클라이언트 GetMetadataAsync
메서드를 사용해 단일 플레이어 파일의 메타데이터(크기, 마지막 수정일 및 생성일, 키, 콘텐츠 유형, 현재 WriteLock)를 검색합니다.
public async void GetPlayerFileMetadata()
{
var metadata = await CloudSaveService.Instance.Files.Player.GetMetadataAsync("fileName.csv");
Debug.Log(metadata.Key);
Debug.Log(metadata.Size);
Debug.Log(metadata.ContentType);
Debug.Log(metadata.Created);
Debug.Log(metadata.LastModified);
Debug.Log(metadata.WriteLock);
}
플레이어 파일 저장
API 클라이언트 SaveAsync
메서드를 사용해 플레이어 파일을 저장합니다.
public async void SavePlayerFile()
{
byte[] file = System.IO.File.ReadAllBytes("fileName.csv");
await CloudSaveService.Instance.Files.Player.SaveAsync("key", file);
}
플레이어 파일 삭제
API 클라이언트 DeleteAsync
메서드를 사용해 플레이어 파일을 삭제합니다.
public async void DeletePlayerFile()
{
await CloudSaveService.Instance.Files.Player.DeleteAsync("key");
}
플레이어 파일 나열
API 클라이언트 ListAllAsync
메서드를 사용해 플레이어의 모든 파일 이름 목록을 가져옵니다.
public async void ListPlayerFiles()
{
List<string> files = await CloudSaveService.Instance.Files.Player.ListAllAsync();
for (int i = 0; i < files.Count; i++)
{
Debug.Log(files[i]);
}
}
Unity Dashboard를 사용하여 개별 플레이어의 파일에 액세스하고, Cloud Save 모듈의 LiveOps 섹션에 있는 플레이어 세부 정보에서 이러한 파일을 확인할 수 있습니다.
오류 처리
오류 처리 로직에 대해 API 오류 응답을 반환하는 오류 코드 또는 유형을 사용합니다. 오류 메시지는 추후에 변경될 수도 있으므로 되도록 사용을 지양합니다.
엔드 투 엔드 초기화 및 인증 플로
다음 예제는 Authentication 패키지를 사용하여 익명 인증을 시작하고, 플레이어 ID를 로그하고, Cloud Save를 초기화하고, 플레이어의 저장된 파일에서 모든 키와 이름을 가져오는 방법을 보여 줍니다.
using Unity.Services.Authentication;
using System.Threading.Tasks;
using System.Collections.Generic;
using Unity.Services.Core;
using Unity.Services.CloudSave;
using UnityEngine;
public class AuthenticationExample : MonoBehaviour
{
private List<string> keys;
private List<string> files;
internal async Task Awake()
{
await UnityServices.InitializeAsync();
await SignInAnonymously();
keys = await CloudSaveService.Instance.Data.Player.ListAllKeysAsync();
files = await CloudSaveService.Instance.Files.Player.ListAllAsync();
}
private async Task SignInAnonymously()
{
AuthenticationService.Instance.SignedIn += () =>
{
var playerId = AuthenticationService.Instance.PlayerId;
Debug.Log("Signed in as: " + playerId);
};
AuthenticationService.Instance.SignInFailed += s =>
{
// Take some action here...
Debug.Log(s);
};
await AuthenticationService.Instance.SignInAnonymouslyAsync();
}
}