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
相关产品推荐
相关产品推荐

