Gespeicherte Spiele in Unity-Spielen

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

Vorbereitung

  • Richten Sie Ihr Projekt und das Google Play-Spiele-Plug‑in für Unity ein. Weitere Informationen finden Sie im Startleitfaden.

  • „Gespeicherte Spiele“ ist aktiviert. Weitere Informationen finden Sie unter Gespeicherte Spiele.

Benutzeroberfläche für gespeicherte Spiele anzeigen

Die Standard-UI zum Auswählen oder Erstellen eines Eintrags für ein gespeichertes Spiel wird durch Aufrufen von:

    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 ein gespeichertes Spiel geschrieben oder daraus gelesen 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 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 behoben werden.

Es gibt zwei offene Methoden zur Konfliktlösung. 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 ISavedGameClient.

    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 der Spielstatus darin gespeichert werden. Dazu wird CommitUpdate aufgerufen. Es gibt vier Parameter für CommitUpdate:

  1. Die gespeicherten Spielmetadaten, die an den Rückruf übergeben werden, der an einen der Open-Aufrufe übergeben wird.
  2. die an den Metadaten vorzunehmenden Änderungen.
  3. das tatsächliche Byte-Array mit Daten
  4. Ein 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

Sobald die gespeicherte Spieldatei geöffnet ist, 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 wurde, 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
        }
    }