Unity에서 Cloud Save 사용

본 기술 자료에는 Cloud Save SDK 3.0에 관한 예제가 포함되어 있습니다.

일반적인 워크플로

Unity 내의 정규 C# 스크립트에서 Cloud Save SDK를 호출할 수 있습니다. Unity의 스크립팅에 관한 자세한 내용은 스크립트 생성 및 사용을 참고하십시오.

  1. Unity 내에서 C# MonoBehaviour 스크립트를 생성합니다. 스크립트 생성 및 사용을 확인합니다.
  2. 스크립트 내에서 Unity Authentication 서비스를 구성합니다.
  3. 스크립트 내에서 Cloud Save SDK에 호출을 추가합니다.
  4. 새로 만든 스크립트를 게임 오브젝트에 연결합니다. 스크립트 생성 및 사용 페이지를 방문합니다.
  5. Play를 선택하여 프로젝트를 실행하고 Cloud Save를 실제로 경험해 봅니다.

MonoBehaviour 스크립트에 다음 네임스페이스를 포함하여 Cloud Save 클라이언트를 사용합니다.

using Unity.Services.CloudSave;

제공되는 CloudSaveSample 스크립트는 인증과 서비스 초기화, Cloud Save 클라이언트 사용, 중요한 async 개념을 보여 줍니다. Unity에서 Package ManagerCloud SaveSamples를 선택하여 샘플을 확인할 수 있습니다.

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();
    }
}