Gespeicherte Spiele in Unity-Spielen

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

Vorbereitung

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

  • Gespeicherte Spiele sind aktiviert. Weitere Informationen finden Sie in der Leitfaden zu gespeicherten Spielen.

UI für gespeicherte Spiele aufrufen

Die Standard-Benutzeroberfläche zum Auswählen oder Erstellen eines Spieleintrags wird Anrufe:

    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 du Daten in einem gespeicherten Spiel lesen oder schreiben kannst, muss das gespeicherte Spiel folgende Voraussetzungen erfüllen: geöffnet. Da der gespeicherte Spielstatus lokal auf dem Gerät im Cache gespeichert wird, in der Cloud gespeichert sind, 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, Daten, die sich derzeit in der Cloud befinden, wurden von einem anderen Gerät geschrieben. Diese Konflikte müssen beim Öffnen der gespeicherten Spieldaten gelöst werden.

Es gibt zwei Methoden zur Konfliktlösung: OpenWithAutomaticDisputeResolution akzeptiert eine Standardlösungsstrategie eingeben und die Konflikte automatisch lösen. Bei der anderen Methode OpenWithManualCollaborationResolution akzeptiert eine Callback-Methode, die den Vorgang manuelle Lösung des Konflikts.

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

    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 zum Speichern des Spielstatus geschrieben werden. Dazu wird CommitUpdate aufgerufen. Es gibt vier Parameter für CommitUpdate:

  1. Die gespeicherten Spielmetadaten, die an einen der Open-Aufrufe übergeben werden.
  2. die an den Metadaten vorzunehmen sind.
  3. das tatsächliche Byte-Array der Daten
  4. Einen Callback, der nach Abschluss des Commits aufgerufen wird.
    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. Dieses wird durch Aufrufen von ReadBinaryData erreicht.

    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 Löschen:

    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
        }
    }