当前位置:   article > 正文

Unity接入GooglePlayGames登陆与OpenSaveGame踩坑_unity 接入google play 服务 v2

unity 接入google play 服务 v2

接入API网上很多,这里放几个链接,大家参考,本文只讲我遇到的坑点

GitHub官方文档,讲的比较全面

视频讲解登陆接入(里面有登入Unity账号的部分,没有需要的可以略着看)

GooglePlayGame玩家数据存储

一、GooglePlayGames插件导入

正常来说,导入GooglePlayGames插件后,不需要额外操作,但可能还是会打包失败,报错:找不到GooglePlayGames库

可以尝试以下操作 

1.找到文件Assets/GooglePlayGames/com.google.play.games/GooglePlayGamesPluginDependencies.xml

把文件中

<repository>Packages/com.google.play.games/Editor/m2repository</repository>

修改为

<repository>Assets/GooglePlayGames/com.google.play.games/Editor/m2repository</repository>

2.执行:Assets->External Dependency Manager->Android Resolver->Force Resolve

查看GeneratedLocalRepo目录中是否有GooglePlayGames目录

如果以上两步操作都没有问题,打包时还是提示找不到GooglePlayGames库,可以尝试把GooglePlayGames库全部删掉,重新导入,重新执行上述两步。

二、登录失败

如果我们调用登录是这样写的:

PlayGamesPlatform.Instance.Authenticate();
在某些情况,可能会返回失败,这时我们在失败中,再加入下面这句,是可以成功。
PlayGamesPlatform.Instance.ManuallyAuthenticate();

四、签名问题

我们可能会遇到打的APK可以登陆,但打的aab包,或从商店下载的包无法登陆;我们把证书指纹修改为发布证书,导致APK又无法登陆,都是因为证书问题

正确配置需要有两个凭据

一个对应调试证书

一个对应发布证书

有两个凭据,需要有一个勾选:“新安装的应用将使用此凭据”

按照谷歌的说法,应该是发布证书勾选才对,但实际,从商店下载的包会登陆失败,最后我尝试将调试证书勾选,莫名其秒的成功了,无论是APK,还是从商店下载的,都没有问题。具体什么原因,我没有搞明白,如果哪位知道原因,请在评论区留言,感谢!

四、手机中必须安装Google Play 游戏APP

刚开始我手机中没有安装GooglePlay游戏APP,一直登入失败,导致我浪费了半天时间。

我们开发中也要考虑这个问题,如果玩家的手机没有安装,导致登陆失败,开发者应该处理这种情况。

这是我的登陆代码,供大家参教

  1. private bool manuallyAuthenticate = false;
  2. void Awake()
  3. {
  4. PlayGamesPlatform.Activate();
  5. }
  6. public override void Login() {
  7. SDKChannel.SDKLog($"点击登陆");
  8. manuallyAuthenticate = false;
  9. PlayGamesPlatform.Instance.Authenticate(OnAuthenticationFinished);
  10. }
  11. private void OnAuthenticationFinished(SignInStatus status)
  12. {
  13. SDKChannel.SDKLog($"登陆回调 status:{status}");
  14. if (status == SignInStatus.Success)
  15. {
  16. JObject callObj = new JObject();
  17. callObj["UserId"] = PlayGamesPlatform.Instance.GetUserId(); //用户ID
  18. callObj["UserName"] = PlayGamesPlatform.Instance.GetUserDisplayName(); //用户名字
  19. SDKChannel.OnSDKCallback((int)ESDKCallType.LoginSuccess, callObj);
  20. }
  21. else
  22. {
  23. if (manuallyAuthenticate == false)
  24. {
  25. PlayGamesPlatform.Instance.ManuallyAuthenticate(OnAuthenticationFinished);
  26. manuallyAuthenticate = true;
  27. }
  28. else
  29. {
  30. JObject callObj = new JObject();
  31. callObj["Status"] = status.ToString(); //状态
  32. SDKChannel.OnSDKCallback((int)ESDKCallType.LoginFailure, callObj);
  33. }
  34. }
  35. }

五、云存储

刚开始我的写法是,在游戏启动时,打开游戏存储(OpenSaveGame),把获得到的game(ISavedGameMetadata game)对象存起来,在游戏中每1分钟调用一次保存游戏(SaveGame)

听上去没有问题,平时的编程思路都是这样

但实际测试,每打开一次游戏存储(OpenSaveGame)时获得的game对象,在保存时,只能使用一次

即:每次保存,必须先去打开游戏对象

这让我有点难以理解,但实际测试是这个样子,如果我的理解有错,欢迎评论留言。

云存储完整代码

  1. /// <summary>
  2. /// 保存玩家游戏数据
  3. /// </summary>
  4. public class SDKGameDataGoogle
  5. {
  6. private static SDKGameDataGoogle _instance;
  7. public static SDKGameDataGoogle Instance
  8. {
  9. get
  10. {
  11. if (_instance == null)
  12. {
  13. _instance = new SDKGameDataGoogle();
  14. }
  15. return _instance;
  16. }
  17. }
  18. private bool _isSaveing;
  19. private Action _action;
  20. private JObject _saveJObject;
  21. private string filename = "data1";
  22. //打开游戏存档
  23. public void OpenGame(Action action)
  24. {
  25. _isSaveing = false;
  26. _action = action;
  27. Debug.Log($"11 打开游戏存档");
  28. if (!this.OpenSavedGame())
  29. {
  30. _action?.Invoke();
  31. }
  32. }
  33. public void SaveGame(JObject jObject)
  34. {
  35. _isSaveing = true;
  36. _saveJObject = jObject;
  37. Debug.Log($"11 保存游戏存档");
  38. this.OpenSavedGame();
  39. }
  40. private bool OpenSavedGame()
  41. {
  42. if (PlayGamesPlatform.Instance == null || PlayGamesPlatform.Instance.SavedGame == null)
  43. {
  44. return false;
  45. }
  46. ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
  47. savedGameClient.OpenWithAutomaticConflictResolution(filename, DataSource.ReadCacheOrNetwork,
  48. ConflictResolutionStrategy.UseOriginal, OnSavedGameOpened);
  49. return true;
  50. }
  51. //打开完成
  52. private void OnSavedGameOpened(SavedGameRequestStatus status, ISavedGameMetadata game) {
  53. Debug.Log($"打开保存的游戏--回调{status}");
  54. if (_isSaveing)
  55. {
  56. if (status == SavedGameRequestStatus.Success)
  57. {
  58. byte[] savedData = System.Text.Encoding.UTF8.GetBytes(this._saveJObject.ToJson(Formatting.None));
  59. this.SaveGame(game, savedData);
  60. }
  61. }
  62. else
  63. {
  64. if (status == SavedGameRequestStatus.Success)
  65. {
  66. ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
  67. savedGameClient.ReadBinaryData(game, OnSavedGameDataRead);
  68. }
  69. else
  70. {
  71. _action?.Invoke();
  72. }
  73. }
  74. }
  75. //拿到元数据
  76. private void OnSavedGameDataRead (SavedGameRequestStatus status, byte[] data) {
  77. Logger.LogError($"拿到玩家数据, status:{status}, data.length:{data.Length}");
  78. if (status == SavedGameRequestStatus.Success)
  79. {
  80. JObject jObject = null;
  81. try
  82. {
  83. string json = System.Text.Encoding.UTF8.GetString(data);
  84. jObject = JObject.Parse(json);
  85. }
  86. catch (Exception e)
  87. {
  88. jObject = new JObject();
  89. }
  90. CSPlayerSettings.InitializedPlayerData(jObject, "googleplaygames", PlayGamesPlatform.Instance.GetUserId());
  91. }
  92. _action?.Invoke();
  93. }
  94. private void SaveGame(ISavedGameMetadata game, byte[] savedData) {
  95. Debug.Log($"22 保存游戏存档");
  96. ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
  97. SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder();
  98. builder = builder.WithUpdatedDescription("Saved game at " + DateTime.Now);
  99. SavedGameMetadataUpdate updatedMetadata = builder.Build();
  100. savedGameClient.CommitUpdate(game, updatedMetadata, savedData, OnSavedGameWritten);
  101. }
  102. private void OnSavedGameWritten (SavedGameRequestStatus status, ISavedGameMetadata game) {
  103. Debug.Log($"33 保存游戏存档结果:{status}");
  104. }
  105. }

文章最后,吐槽一下Unity提供的CloudData

最初我的想法是,接入GoogleSign与Unity的CloudData实现登陆与存储玩家数据,GoogleSign以前已经接过,不用再踩坑,另外发布苹果时,就不用再写一遍苹果存储问题。

一切进行的都很顺利,测试也都通过了,但在两天后,请求加载CloudData时,Unity返回错误:There was a validation error. Check 'Details' for more information

我拿着这个错误去Google搜索,一点资料也没有,尝试清理缓存,还是返回一样的错误。

在我测试的前两天都很正常,突然返回这个错误,且,一旦发生,就是不可逆的,玩家数据彻底丢失!

想不出原因后,无奈只得放弃,重新接入GooglePlayGames​​​​...(。•ˇ‸ˇ•。) ...

当然,如果有哪位大佬知道原因,请在评论区留言,感谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/706992
推荐阅读
相关标签
  

闽ICP备14008679号