W tym artykule opisujemy, jak używać zapisanych gier w usługach gier Play w grach na Unity.
Zanim rozpoczniesz
- Skonfiguruj projekt i wtyczkę Google Play Games do silnika Unity. Więcej informacji znajdziesz w przewodniku dla początkujących. 
- Włączono zapisywanie gier. Szczegółowe informacje znajdziesz w sekcji zapisane gry. 
Wyświetlanie interfejsu zapisanych gier
Standardowy interfejs do wybierania lub tworzenia zapisu gry jest wyświetlany przez wywołanie:
    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
        }
    }
Otwieranie zapisanej gry
Aby odczytać lub zapisać dane w zapisanej grze, musisz ją otworzyć. Ponieważ zapisany stan gry jest przechowywany w pamięci podręcznej lokalnie na urządzeniu i zapisywany w chmurze, mogą wystąpić konflikty w stanie zapisanych danych. Konflikt występuje, gdy urządzenie próbuje zapisać stan w chmurze, ale dane znajdujące się obecnie w chmurze zostały zapisane przez inne urządzenie. Te konflikty trzeba rozwiązać podczas otwierania zapisanych danych gry.
Istnieją 2 otwarte metody obsługi rozwiązywania konfliktów. Pierwsza z nich, OpenWithAutomaticConflictResolution, akceptuje standardową strategię rozwiązywania konfliktów i automatycznie rozwiązuje konflikty. Druga metoda, OpenWithManualConflictResolution, akceptuje metodę wywołania zwrotnego, która umożliwia ręczne rozwiązanie konfliktu.
Więcej informacji o tych metodach znajdziesz w sekcji 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
        }
    }
Zapisywanie gry
Po otwarciu zapisanego pliku gry można go użyć do zapisania stanu gry. W tym celu wywołaj funkcję CommitUpdate. Polecenie CommitUpdate ma 4 parametry:
- metadane zapisanej gry przekazane do wywołania zwrotnego przekazanego do jednego z wywołań Open.
- aktualizacje, które mają zostać wprowadzone w metadanych;
- rzeczywista tablica bajtów danych,
- wywołanie zwrotne, które ma zostać wywołane po zakończeniu zatwierdzania.
    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;
    }
Odczytywanie zapisanej gry
Po otwarciu pliku zapisu stanu gry można go odczytać, aby wczytać stan gry. W tym celu wywołaj funkcję 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
        }
    }
Usuwanie zapisanej gry
Po otwarciu zapisanego pliku gry można go usunąć. Aby to zrobić, wywołaj funkcję 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
        }
    }
