Jogos salvos no Unity

Este tópico descreve como usar o recurso de jogos salvos dos serviços relacionados a jogos do Google Play com o Unity.

Antes de começar

Mostrar a IU de jogos salvos

A IU padrão para selecionar ou criar uma entrada de jogo salvo é mostrada chamando:

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

Abrir um jogo salvo

Para ler ou gravar dados em um jogo salvo, ele precisa estar aberto. Como o estado de jogo salvo é armazenado em cache localmente no dispositivo e salvo na nuvem, é possível encontrar conflitos de dados. Um conflito acontece quando um dispositivo tenta salvar o estado na nuvem, mas os dados que já estão lá foram gravados por outro aparelho. Esses conflitos precisam ser resolvidos ao abrir os dados do jogo salvo.

Há dois métodos de abertura para processar a resolução de conflitos. O primeiro, OpenWithAutomaticConflictResolution, aceita um tipo de estratégia de resolução padrão e resolve automaticamente os conflitos. O outro método, OpenWithManualConflictResolution, aceita um método de callback para permitir a resolução manual do conflito.

Consulte GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs para mais detalhes sobre os métodos.

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

Gravar um jogo salvo

Quando o arquivo do jogo é aberto, ele pode salvar o estado. Para isso, chame CommitUpdate. Há quatro parâmetros no método CommitUpdate:

  1. Os metadados do jogo salvo transmitidos ao callback enviado para uma das chamadas em aberto.
  2. As atualizações que vão ser feitas nos metadados.
  3. A matriz real de bytes de dados.
  4. Um callback que vai ser chamado quando a confirmação for concluída.
    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;
    }

Ler um jogo salvo

Quando o arquivo do jogo é aberto, ele pode ser lido para carregar o estado do jogo. Para fazer isso, chame 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
        }
    }

Excluir um jogo salvo

Quando o arquivo do jogo é aberto, ele pode ser excluído. Para fazer isso, chame Delete.

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