Partite salvate nei giochi Unity

Questo argomento descrive come usare le partite salvate per i servizi per i giochi di Play in Unity giochi.

Prima di iniziare

Visualizzare l'UI delle partite salvate

L'interfaccia utente standard per la selezione o la creazione di una voce di partita salvata viene visualizzata chiamata:

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

Aprire una partita salvata

Per leggere o scrivere dati in una partita salvata, quest'ultima deve essere aperto. Poiché lo stato del gioco salvato viene memorizzato localmente sul dispositivo e salvato in nel cloud, è possibile che si verifichino conflitti nello stato dei dati salvati. Un conflitto si verifica quando un dispositivo tenta di salvare lo stato nel cloud ma i dati attualmente presenti nel cloud sono stati scritti da un altro dispositivo. Questi conflitti devono essere risolti all'apertura dei dati dei giochi salvati.

Esistono 2 metodi aperti per gestire la risoluzione dei conflitti: il primo OpenWithAutomaticDisputeResolution accetta una strategia di risoluzione standard e risolve automaticamente i conflitti. L'altro metodo, OpenWithManualConversation accetta un metodo di callback per consentire la risoluzione manuale del conflitto.

Per ulteriori dettagli, consulta GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs con questi metodi.

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

Scrivere una partita salvata

Una volta aperto il file della partita salvata, puoi scriverlo per salvare lo stato del gioco. Per farlo, chiama CommitUpdate. Esistono quattro parametri CommitUpdate:

  1. i metadati della partita salvata trasmessi al callback a una delle chiamate aperte.
  2. gli aggiornamenti da apportare ai metadati.
  3. l'effettivo array di byte di dati
  4. un callback da chiamare al completamento del commit.
    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;
    }

Leggere una partita salvata

Una volta aperto il file della partita salvata, puoi leggerlo per caricare lo stato del gioco. Questo viene eseguita chiamando ReadBinaryData.

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

Eliminare una partita salvata

Una volta aperto, il file della partita salvata può essere eliminato. Per farlo, chiami Elimina.

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