/// <summary> /// Commits the save to cloud. /// </summary> /// <param name="file">Actual save file. This will replace static reference to current save file</param> /// <param name="fileName">File name. Used only when saving for first time</param> /// <param name="callback">Invoked after commit (true = success)</param> private static void CommitSaveToCloud(SaveDataBundle file, string fileName, System.Action<bool> callback) { ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame; savedGameClient.OpenWithAutomaticConflictResolution( m_saveBundleMetadata.Filename == string.Empty ? fileName : m_saveBundleMetadata.Filename, DataSource.ReadCacheOrNetwork, ConflictResolutionStrategy.UseLongestPlaytime, (SavedGameRequestStatus reqStatus, ISavedGameMetadata openedGame) => { if(reqStatus == SavedGameRequestStatus.Success) { // adding real time since startup so we can determine longes playtime and resolve future conflicts easilly m_saveBundleMetadata = openedGame; SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder (); builder = builder .WithUpdatedPlayedTime(timePlayed) .WithUpdatedDescription("Saved game at " + DateTime.Now); if (bannerTexture != null) { builder = builder.WithUpdatedPngCoverImage(bannerTexture.EncodeToPNG()); } //m_saveBundleMetadata.TotalTimePlayed.Add (new TimeSpan (0, 0, (int)Time.realtimeSinceStartup)) SavedGameMetadataUpdate updatedMetadata = builder.Build(); savedGameClient.CommitUpdate( m_saveBundleMetadata, updatedMetadata, SaveDataBundle.ToByteArray(file), (SavedGameRequestStatus status, ISavedGameMetadata game) => { Debug.Log("SGI CommitUpdate callback invoked with status " + status + ", proceeding..."); if (status == SavedGameRequestStatus.Success) { m_saveBundleMetadata = game; m_currentSaveBundle = file; } if (callback != null) callback.Invoke(status == SavedGameRequestStatus.Success); } ); } } ); }
/// <summary> /// Creates the new save. Save returned in callback is closed!. Open it before use. /// </summary> /// <param name="save">Save.</param> /// <param name="saveCreatedCallback">Invoked when save has been created.</param> private static void CreateNewSave(ISavedGameMetadata save, Action<ISavedGameMetadata> saveCreatedCallback) { ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame; SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder (); builder = builder .WithUpdatedPlayedTime(save.TotalTimePlayed.Add(new TimeSpan(0, 0, (int) Time.realtimeSinceStartup))) .WithUpdatedDescription("Saved at " + DateTime.Now); SavedGameMetadataUpdate updatedMetadata = builder.Build(); SaveDataBundle newBundle = new SaveDataBundle(new StoredPlayerData()); savedGameClient.CommitUpdate( save, updatedMetadata, SaveDataBundle.ToByteArray(newBundle), (SavedGameRequestStatus status,ISavedGameMetadata game) => { if (status == SavedGameRequestStatus.Success) { m_saveBundleMetadata = game; if (saveCreatedCallback != null) saveCreatedCallback(game); } Debug.Log("Creating new save finished with status :" + status.ToString()); } ); }
/// <summary> /// Prepare updated metadata and commit update to GPGS /// </summary> /// <param name="_gameMetaData">Game meta data.</param> /// <param name="savedData">Saved data.</param> /// <param name="totalPlaytime">Total playtime.</param> static void SaveOnGPGS (ISavedGameMetadata _gameMetaData, byte[] savedData, TimeSpan totalPlaytime) { ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame; Texture2D savedImage = getScreenshot(); SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder(); builder = builder .WithUpdatedPlayedTime(totalPlaytime) .WithUpdatedDescription("Saved game at " + DateTime.Now); if (savedImage != null) { // This assumes that savedImage is an instance of Texture2D // and that you have already called a function equivalent to // getScreenshot() to set savedImage // NOTE: see sample definition of getScreenshot() method below byte[] pngData = savedImage.EncodeToPNG(); builder = builder.WithUpdatedPngCoverImage(pngData); } SavedGameMetadataUpdate updatedMetadata = builder.Build(); UIManager.Notify("commiting"); savedGameClient.CommitUpdate(_gameMetaData, updatedMetadata, savedData, OnSavedGameWritten); }
/* * Does the cloud save. * Converts PlayerData into a byte array. Updates play time and saved file description. Then commits. * */ public void CloudSave(SavedGameRequestStatus status, ISavedGameMetadata game) { Save(); byte[] data = ToBytes(this.playerData); //Calculate play time and total playtime. TimeSpan delta = DateTime.Now.Subtract(loadedTime); playingTime += delta; this.timePlayed = playingTime; ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame; SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder(); builder = builder.WithUpdatedPlayedTime(this.timePlayed).WithUpdatedDescription("Current Level: " + playerData.currentGameLevel + " Current Player Level: " + playerData.playerLevel); SavedGameMetadataUpdate updatedMetadata = builder.Build(); savedGameClient.CommitUpdate(game, updatedMetadata, data, OnSaveWritten); }
void SaveGameData(ISavedGameMetadata game, byte[] savedData) { ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame; SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder(); builder = builder .WithUpdatedPlayedTime(totalPlaytime) .WithUpdatedDescription("Saved game at " + DateTime.Now); SavedGameMetadataUpdate updatedMetadata = builder.Build(); savedGameClient.CommitUpdate(game, updatedMetadata, savedData, OnSavedGameWritten); }
public void SaveGame(ISavedGameMetadata game, byte[] savedData, System.TimeSpan totalPlaytime, Texture2D img, System.Action<SavedGameRequestStatus, ISavedGameMetadata> callback) { ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame; SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder(); builder = builder .WithUpdatedPlayedTime(totalPlaytime) .WithUpdatedDescription("Saved game at " + System.DateTime.Now); if (img != null) { byte[] pngData = img.EncodeToPNG(); builder = builder.WithUpdatedPngCoverImage(pngData); } SavedGameMetadataUpdate updatedMetadata = builder.Build(); savedGameClient.CommitUpdate(game, updatedMetadata, savedData, callback); }
public void SaveGame(ISavedGameMetadata game, byte[] savedData, TimeSpan totalPlaytime) { ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame; SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder(); builder = builder .WithUpdatedPlayedTime(totalPlaytime) .WithUpdatedDescription("Saved game at " + DateTime.Now); // my customization Texture2D savedImage = GameObject.FindGameObjectWithTag("GameManager").GetComponent<GameManager>().saveGameImage; // end my customization if (savedImage != null) { // This assumes that savedImage is an instance of Texture2D // and that you have already called a function equivalent to // getScreenshot() to set savedImage // NOTE: see sample definition of getScreenshot() method below byte[] pngData = savedImage.EncodeToPNG(); builder = builder.WithUpdatedPngCoverImage(pngData); } SavedGameMetadataUpdate updatedMetadata = builder.Build(); savedGameClient.CommitUpdate(game, updatedMetadata, savedData, OnSavedGameWritten); }