You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity游戏中如何用Play Games Services Saved Games存读金币数值

在Unity中使用Play Games Services Saved Games存读金币数值

核心思路

Play Games Services的Saved Games功能本质是存储二进制数据,官方示例的图片存储只是把图片转成字节数组的特例。要存金币数值,只需要把数值序列化(比如转成JSON或二进制)为字节数组,再按Saved Games的流程写入即可。


1. 写入金币数据

以下是完整的异步保存流程,替换官方示例中的图片处理逻辑:

using UnityEngine;
using GooglePlayGames;
using GooglePlayGames.BasicApi.SavedGame;
using System.Text;

public class SaveGameManager : MonoBehaviour
{
    // 保存文件名,建议用唯一标识比如玩家ID+固定后缀
    private const string SaveFileName = "PlayerGoldSave";

    public void SaveGold(int goldCount)
    {
        // 确保玩家已登录Play Games
        if (!PlayGamesPlatform.Instance.IsAuthenticated())
        {
            Debug.LogError("玩家未登录Play Games,无法保存数据");
            return;
        }

        // 打开Saved Game文件(不存在则创建)
        PlayGamesPlatform.Instance.SavedGame.OpenWithAutomaticConflictResolution(
            SaveFileName,
            DataSource.ReadCacheOrNetwork,
            ConflictResolutionStrategy.UseLongestPlaytime,
            OnSaveGameOpenedForWrite
        );

        void OnSaveGameOpenedForWrite(SavedGameRequestStatus status, ISavedGameMetadata game)
        {
            if (status != SavedGameRequestStatus.Success)
            {
                Debug.LogError($"打开保存文件失败:{status}");
                return;
            }

            // 把金币数值序列化为JSON字符串,再转成字节数组
            var saveData = new SaveData { gold = goldCount };
            string json = JsonUtility.ToJson(saveData);
            byte[] data = Encoding.UTF8.GetBytes(json);

            // 设置保存元数据(可选,比如更新描述)
            var updateMetadata = new SavedGameMetadataUpdate.Builder()
                .WithUpdatedDescription($"金币:{goldCount} | 保存时间:{System.DateTime.Now}")
                .Build();

            // 写入数据
            PlayGamesPlatform.Instance.SavedGame.CommitUpdate(
                game,
                updateMetadata,
                data,
                OnSaveGameCommitted
            );
        }

        void OnSaveGameCommitted(SavedGameRequestStatus status, ISavedGameMetadata game)
        {
            if (status == SavedGameRequestStatus.Success)
            {
                Debug.Log("金币数据保存成功");
            }
            else
            {
                Debug.LogError($"保存失败:{status}");
            }
        }
    }

    // 用于序列化的简单数据类
    [System.Serializable]
    private class SaveData
    {
        public int gold;
    }
}

2. 读取金币数据

同样通过异步流程加载Saved Game文件,反序列化字节数组得到数值:

public void LoadGold()
{
    if (!PlayGamesPlatform.Instance.IsAuthenticated())
    {
        Debug.LogError("玩家未登录Play Games,无法加载数据");
        return;
    }

    PlayGamesPlatform.Instance.SavedGame.OpenWithAutomaticConflictResolution(
        SaveFileName,
        DataSource.ReadCacheOrNetwork,
        ConflictResolutionStrategy.UseLongestPlaytime,
        OnSaveGameOpenedForRead
    );

    void OnSaveGameOpenedForRead(SavedGameRequestStatus status, ISavedGameMetadata game)
    {
        if (status != SavedGameRequestStatus.Success)
        {
            Debug.LogError($"打开保存文件失败:{status}");
            // 首次无保存文件时,初始化金币为0
            OnGoldLoaded(0);
            return;
        }

        // 读取字节数据
        PlayGamesPlatform.Instance.SavedGame.ReadBinaryData(game, OnBinaryDataRead);
    }

    void OnBinaryDataRead(SavedGameRequestStatus status, byte[] data)
    {
        if (status != SavedGameRequestStatus.Success || data == null || data.Length == 0)
        {
            Debug.Log("无保存数据,初始化金币为0");
            OnGoldLoaded(0);
            return;
        }

        // 反序列化JSON字符串为数值
        string json = Encoding.UTF8.GetString(data);
        SaveData saveData = JsonUtility.FromJson<SaveData>(json);
        OnGoldLoaded(saveData.gold);
    }

    // 加载完成后的回调,这里可以更新UI或游戏逻辑
    void OnGoldLoaded(int loadedGold)
    {
        Debug.Log($"加载到金币:{loadedGold}");
        // 例如:GameManager.Instance.SetGold(loadedGold);
    }
}

关键注意事项

  • 登录验证:所有Saved Games操作必须在玩家登录Play Games后执行,否则会失败。
  • 冲突处理:示例中用了ConflictResolutionStrategy.UseLongestPlaytime,你可以根据需求选择其他策略(比如UseOriginal或UseUnmerged)。
  • 序列化方式:除了JSON,也可以用BinaryFormatter直接序列化数值,但JSON更易调试,且跨平台兼容性更好。
  • 错误处理:务必处理异步回调中的错误状态,避免因网络或权限问题导致游戏逻辑异常。

内容的提问来源于stack exchange,提问作者aronsommer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:10:29