通过 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 概念。您可以通过选择 Package Manager(包管理器) > Cloud Save > Samples(示例),在 Unity 中查看示例。

对 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(Unity 后台)查看单个玩家的数据。

以字节数组形式获取玩家文件

使用 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(Unity 后台)访问单个玩家的文件,这类文件位于 LiveOps 部分的 Cloud Save 模块的玩家细节中。

错误处理

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