问题描述
当我尝试使用 Google Play 游戏插件保存或加载我的游戏时(即使我已登录),logcat 向我显示:
尝试了不同的方法来保存游戏,但它再次显示并且再次。附言成就和排行榜运行良好。这是我调用保存和加载过程的脚本:
#if UNITY_ANDROID
using UnityEngine;
using System;
using System.Collections.Generic;
//gpg
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using GooglePlayGames.BasicApi.SavedGame;
//for encoding
using System.Text;
//for extra save ui
using UnityEngine.socialPlatforms;
//for text,remove
using UnityEngine.UI;
public class SaveManager :MonoBehavIoUr{
private static SaveManager _instance;
public static SaveManager Instance{
get{
if (_instance == null) {
_instance = new SaveManager();
}
return _instance;
}
}
//keep track of saving or loading during callbacks.
private bool m_saving;
//save name. This name will work,change it if you like.
private static string m_saveName = "game_save_name";
//This is the saved file. Put this in seperate class with other variables for more advanced setup. Remember to change merging,toBytes and fromBytes for more advanced setup.
private string saveString = "";
//check with GPG (or other*) if user is authenticated. *e.g. GameCenter
private bool Authenticated {
get {
return Social.Active.localUser.authenticated;
}
}
//merges loaded bytearray with old save
private void ProcessCloudData(byte[] cloudData) {
if (cloudData == null) {
Debug.Log("No data saved to the cloud yet...");
return;
}
Debug.Log("Decoding cloud data from bytes.");
string progress = FromBytes(cloudData);
Debug.Log("Merging with existing game progress.");
MergeWith(progress);
}
//load save from cloud
public void LoadFromCloud(){
Debug.Log("Loading game progress from the cloud.");
m_saving = false;
((PlayGamesPlatform)Social.Active).SavedGame.OpenWithAutomaticConflictResolution(
m_saveName,//name of file.
DataSource.ReadCacheOrNetwork,ConflictResolutionStrategy.UseLongestPlaytime,SavedGameOpened);
}
//overwrites old file or saves a new one
public void SavetoCloud() {
if (Authenticated) {
Debug.Log("Saving progress to the cloud... filename: " + m_saveName);
m_saving = true;
//save to named file
((PlayGamesPlatform)Social.Active).SavedGame.OpenWithAutomaticConflictResolution(
m_saveName,//name of file. If save doesn't exist it will be created with this name
DataSource.ReadCacheOrNetwork,SavedGameOpened);
} else {
Debug.Log("Not authenticated!");
}
}
//save is opened,either save or load it.
private void SavedGameOpened(SavedGameRequestStatus status,ISavedGameMetadata game) {
//check success
if (status == SavedGameRequestStatus.Success){
//saving
if (m_saving){
//read bytes from save
byte[] data = ToBytes();
//create builder. here you can add play time,time created etc for UI.
SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder();
SavedGameMetadataUpdate updatedMetadata = builder.Build();
//saving to cloud
((PlayGamesPlatform)Social.Active).SavedGame.CommitUpdate(game,updatedMetadata,data,SavedGameWritten);
//loading
} else {
((PlayGamesPlatform)Social.Active).SavedGame.ReadBinaryData(game,SavedGameLoaded);
}
//error
} else {
Debug.LogWarning("Error opening game: " + status);
}
}
//callback from SavedGameOpened. Check if loading result was successful or not.
private void SavedGameLoaded(SavedGameRequestStatus status,byte[] data) {
if (status == SavedGameRequestStatus.Success){
Debug.Log("SaveGameLoaded,success=" + status);
ProcessCloudData(data);
} else {
Debug.LogWarning("Error reading game: " + status);
}
}
//callback from SavedGameOpened. Check if saving result was successful or not.
private void SavedGameWritten(SavedGameRequestStatus status,ISavedGameMetadata game) {
if (status == SavedGameRequestStatus.Success){
Debug.Log("Game " + game.Description + " written");
} else {
Debug.LogWarning("Error saving game: " + status);
}
}
//merge local save with cloud save. Here is where you change the merging betweeen cloud and local save for your setup.
private void MergeWith(string other) {
if (other != "") {
saveString = other;
} else {
Debug.Log("Loaded save string doesn't have any content");
}
}
//return saveString as bytes
private byte[] ToBytes() {
byte[] bytes = Encoding.UTF8.GetBytes(saveString);
return bytes;
}
//take bytes as arg and return string
private string FromBytes(byte[] bytes) {
string decodedString = Encoding.UTF8.GetString(bytes);
return decodedString;
}
// -------------------- ### Extra UI for testing ### --------------------
//call this with Unity button to view all saves on GPG. Bug: Can't close GPG window for some reason without restarting.
public void showUI() {
// user is ILocalUser from Social.LocalUser - will work when authenticated
ShowSavesystemUI(Social.localUser,(SelectUIStatus status,ISavedGameMetadata game) => {
// do whatever you need with save bundle
});
}
//displays savefiles in the cloud. This will only include one savefile if the m_saveName hasn't been changed
private void ShowSavesystemUI(ILocalUser user,Action<SelectUIStatus,ISavedGameMetadata> callback) {
uint maxnumTodisplay = 3;
bool allowCreateNew = true;
bool allowDelete = true;
ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
if (savedGameClient != null) {
savedGameClient.ShowSelectSavedGameUI(user.userName + "\u0027s saves",maxnumTodisplay,allowCreateNew,allowDelete,ISavedGameMetadata saveGame) => {
// some error occured,just show window again
if (status != SelectUIStatus.SavedGameSelected) {
ShowSavesystemUI(user,callback);
return;
}
if (callback != null)
callback.Invoke(status,saveGame);
});
} else {
// this is usually due to incorrect APP ID
Debug.LogError("Save Game client is null...");
}
}
}
#endif
................................
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)