Jeux enregistrés dans Unity

Cet article explique comment utiliser les jeux enregistrés pour les services de jeux Play dans Unity.

Avant de commencer

Afficher l'interface utilisateur des jeux enregistrés

L'interface utilisateur standard permettant de sélectionner ou de créer une entrée de jeu enregistrée s'affiche en appelant la méthode suivante :

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

Ouvrir un jeu enregistré

Pour lire ou écrire des données dans un jeu enregistré, vous devez l'ouvrir. Étant donné que l'état du jeu enregistré est mis en cache localement sur l'appareil et enregistré dans le cloud, il est possible que vous rencontriez des conflits au niveau de l'état des données enregistrées. Un conflit se produit lorsqu'un appareil tente d'enregistrer un état dans le cloud alors que les données qui s'y trouvent déjà ont été écrites par un autre appareil. Ces conflits doivent être résolus à l'ouverture des données de jeu enregistrées.

Il existe deux méthodes ouvertes pour résoudre ces conflits. La première, OpenWithAutomaticConflictResolution accepte un type de stratégie de résolution standard et résout automatiquement les conflits. L'autre méthode, OpenWithManualConflictResolution accepte une méthode de rappel pour permettre la résolution manuelle du conflit.

Pour en savoir plus sur ces méthodes, consultez GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs.

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

Écrire un jeu enregistré

Une fois ouvert le fichier de jeu enregistré, vous pouvez le modifier pour enregistrer l'état du jeu. Pour ce faire, appelez CommitUpdate. Il existe quatre paramètres pour CommitUpdate :

  1. les métadonnées de jeu enregistrées transmises au rappel puis à l'un des appels ouverts ;
  2. les modifications à apporter aux métadonnées ;
  3. le tableau d'octets réel des données ;
  4. un rappel à appeler une fois le commit terminé.
    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;
    }

Lire un jeu enregistré

Une fois ouvert le fichier de jeu enregistré, vous pouvez le lire pour charger l'état du jeu. Pour ce faire, vous devez appeler 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
        }
    }

Supprimer un jeu enregistré

Une fois ouvert le fichier de jeu enregistré, il est possible de le supprimer. Pour ce faire, appelez 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
        }
    }