Gespeicherte Spiele in Unity-Spielen

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

Vorbereitung

Benutzeroberfläche für gespeicherte Spiele anzeigen

Die Standard-Benutzeroberfläche zum Auswählen oder Erstellen eines gespeicherten Spieleintrags wird durch Aufrufen von folgendem Code 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 Spiel geöffnet sein. Da der gespeicherte Spielstatus lokal auf dem Gerät im Cache und in der Cloud gespeichert wird, kann es zu Konflikten beim Status der gespeicherten Daten kommen. Ein Konflikt tritt auf, wenn ein Gerät versucht, den Status in der Cloud zu speichern, die Daten in der Cloud 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, die die Konfliktlösung unterstützen. Die erste, OpenWithAutomaticConflictResolution, akzeptiert einen Standardtyp für die Lösungsstrategie und löst die Konflikte automatisch. Die andere Methode, OpenWithManualConflictResolution, akzeptiert eine Callback-Methode, um die manuelle Lösung des Konflikts zu ermöglichen.

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 wurde, kann sie geschrieben werden, um den Spielstatus zu speichern. Rufen Sie dazu CommitUpdate auf. Für CommitUpdate gibt es vier Parameter:

  1. die Metadaten des gespeicherten Spiels, die an den Rückruf übergeben werden, der an einen der Open-Aufrufe übergeben wird.
  2. die Änderungen an den Metadaten.
  3. das eigentliche Byte-Array der Daten
  4. einen Callback, der aufgerufen wird, wenn der Commit abgeschlossen ist.
    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. Rufen Sie dazu ReadBinaryData auf.

    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

Nachdem die gespeicherte Spieldatei geöffnet wurde, kann sie gelöscht werden. Rufen Sie dazu 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
        }
    }