Gespeicherte Spiele in Unity-Spielen

In diesem Abschnitt wird beschrieben, wie Sie gespeicherte Spiele in Unity-Spielen für Play-Spieldienste verwenden.

Vorbereitung

Benutzeroberfläche der gespeicherten Spiele anzeigen

Die Standard-UI zum Auswählen oder Erstellen eines gespeicherten Spieleintrags wird durch folgenden Aufruf angezeigt:

    void ShowSelectUI() {
        uint maxNumToDisplay = 5;
        bool allowCreateNew = false;
        bool allowDelete = true;

        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.ShowSelectSavedGameUI("Select saved game",
            maxNumToDisplay,
            allowCreateNew,
            allowDelete,
            OnSavedGameSelected);
    }


    public void OnSavedGameSelected (SelectUIStatus status, ISavedGameMetadata game) {
        if (status == SelectUIStatus.SavedGameSelected) {
            // handle selected game save
        } else {
            // handle cancel or error
        }
    }

Gespeichertes Spiel öffnen

Damit Daten in einem gespeicherten Spiel gelesen oder geschrieben werden können, muss das gespeicherte Spiel geöffnet werden. Da der gespeicherte Spielstatus lokal auf dem Gerät im Cache gespeichert und in der Cloud gespeichert wird, kann es zu Konflikten im Status der gespeicherten Daten kommen. Ein Konflikt tritt auf, wenn ein Gerät versucht, den Status in der Cloud zu speichern, die Daten, die sich derzeit in der Cloud befinden, jedoch von einem anderen Gerät geschrieben wurden. Diese Konflikte müssen beim Öffnen der gespeicherten Spieldaten gelöst werden.

Es gibt zwei offene Methoden, um Konflikte zu lösen. Die erste OpenWithAutomaticUsageResolution akzeptiert eine Strategie zur Standardauflösung und löst die Konflikte automatisch. Bei der anderen Methode, OpenWithManuellekonfliktResolution, wird eine Callback-Methode akzeptiert, mit der der Konflikt manuell gelöst werden kann.

Weitere Informationen zu diesen Methoden finden Sie unter GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs.

    void OpenSavedGame(string filename) {
        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.OpenWithAutomaticConflictResolution(filename, DataSource.ReadCacheOrNetwork,
            ConflictResolutionStrategy.UseLongestPlaytime, OnSavedGameOpened);
    }

    public void OnSavedGameOpened(SavedGameRequestStatus status, ISavedGameMetadata game) {
        if (status == SavedGameRequestStatus.Success) {
            // handle reading or writing of saved game.
        } else {
            // handle error
        }
    }

Gespeichertes Spiel schreiben

Sobald die gespeicherte Spieldatei geöffnet ist, kann sie geschrieben werden, um den Spielstatus zu speichern. Dies erfolgt durch Aufrufen von CommitUpdate. Für das CommitUpdate gibt es vier Parameter:

  1. die Metadaten des gespeicherten Spiels, die an den Callback übergeben und an einen der Open-Aufrufe übergeben werden.
  2. die Metadaten aktualisiert werden.
  3. das tatsächliche Byte-Array der Daten
  4. Einen Callback, der nach Abschluss des Commits aufgerufen werden soll.
    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());
        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);
    }

    public void OnSavedGameWritten (SavedGameRequestStatus status, ISavedGameMetadata game) {
        if (status == SavedGameRequestStatus.Success) {
            // handle reading or writing of saved game.
        } else {
            // handle error
        }
    }

    public Texture2D getScreenshot() {
        // Create a 2D texture that is 1024x700 pixels from which the PNG will be
        // extracted
        Texture2D screenShot = new Texture2D(1024, 700);

        // Takes the screenshot from top left hand corner of screen and maps to top
        // left hand corner of screenShot texture
        screenShot.ReadPixels(
            new Rect(0, 0, Screen.width, (Screen.width/1024)*700), 0, 0);
        return screenShot;
    }

Gespeichertes Spiel lesen

Nachdem die gespeicherte Spieldatei geöffnet wurde, kann sie gelesen werden, um den Spielstatus zu laden. Dazu wird ReadBinaryData aufgerufen.

    void LoadGameData (ISavedGameMetadata game) {
        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.ReadBinaryData(game, OnSavedGameDataRead);
    }

    public void OnSavedGameDataRead (SavedGameRequestStatus status, byte[] data) {
        if (status == SavedGameRequestStatus.Success) {
            // handle processing the byte array data
        } else {
            // handle error
        }
    }

Gespeichertes Spiel löschen

Sobald die gespeicherte Spieldatei geöffnet ist, kann sie gelöscht werden. Dazu rufen Sie Delete auf.

    void DeleteGameData (string filename) {
        // Open the file to get the metadata.
        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.OpenWithAutomaticConflictResolution(filename, DataSource.ReadCacheOrNetwork,
            ConflictResolutionStrategy.UseLongestPlaytime, DeleteSavedGame);
    }

    public void DeleteSavedGame(SavedGameRequestStatus status, ISavedGameMetadata game) {
        if (status == SavedGameRequestStatus.Success) {
            ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
            savedGameClient.Delete(game);
        } else {
            // handle error
        }
    }