Gespeicherte Spiele in Unity-Spielen

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

Vorbereitung

  • Richten Sie Ihr Projekt und das Google Play Games-Plug-in für Unity ein. Weitere Informationen finden Sie unter Erste Schritte.

  • Aktivieren Sie gespeicherte Spiele. Weitere Informationen finden Sie unter Gespeicherte Spiele für Details.

UI für gespeicherte Spiele anzeigen

Die Standard-UI zum Auswählen oder Erstellen eines gespeicherten Spiels wird durch Aufrufen von Folgendem 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

Wenn Sie Daten in ein gespeichertes Spiel schreiben oder daraus lesen möchten, muss das gespeicherte Spiel geöffnet werden. Da der Status des gespeicherten Spiels lokal auf dem Gerät zwischengespeichert 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 in der Cloud aber von einem anderen Gerät geschrieben wurden. Diese Konflikte müssen beim Öffnen der gespeicherten Spieldaten behoben werden.

Es gibt zwei Open-Methoden, die die Konfliktlösung verarbeiten. Die erste Methode 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

Nachdem die gespeicherte Spieldatei geöffnet wurde, kann sie geschrieben werden, um den Spielstatus zu speichern. Rufen Sie dazu CommitUpdate auf. Es gibt vier Parameter für CommitUpdate:

  1. Die Metadaten des gespeicherten Spiels, die an den Callback übergeben werden, der an einen der Open-Aufrufe übergeben wird.
  2. Die Aktualisierungen, die an den Metadaten vorgenommen werden sollen.
  3. Das tatsächliche Byte-Array der Daten
  4. Ein Callback, das aufgerufen werden soll, 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
        }
    }