Game tersimpan di game Unity

Topik ini menjelaskan cara menggunakan game tersimpan untuk Layanan game Play di game Unity.

Sebelum memulai

  • Menyiapkan project Anda dan plugin Google Play Game untuk Unity. Untuk mengetahui detailnya, lihat Panduan memulai.

  • Game tersimpan diaktifkan. Lihat panduan game tersimpan untuk mengetahui detailnya.

Menampilkan UI game tersimpan

UI standar untuk memilih atau membuat entri game tersimpan ditampilkan dengan memanggil:

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

Membuka game tersimpan

Untuk membaca atau menulis data ke game tersimpan, game tersimpan harus dibuka. Status game tersimpan di-cache secara lokal di perangkat dan disimpan ke cloud. Oleh karena itu, Anda mungkin mengalami konflik dalam status data tersimpan. Konflik terjadi saat perangkat mencoba menyimpan status ke cloud, tetapi data yang saat ini ada di cloud ditulis oleh perangkat lain. Konflik ini harus diselesaikan saat membuka data game tersimpan.

Ada 2 metode terbuka yang menangani resolusi konflik, OpenWithAutomaticKonflikResolution pertama menerima jenis strategi resolusi standar dan otomatis akan menyelesaikan konflik. Metode lainnya, OpenWithManualConflictResolution menerima metode callback untuk mengizinkan resolusi konflik secara manual.

Lihat GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs untuk detail metode ini selengkapnya.

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

Menulis game tersimpan

Setelah file game tersimpan dibuka, file tersebut dapat ditulis untuk menyimpan status game. Ini dilakukan dengan memanggil CommitUpdate. Ada empat parameter untuk CommitUpdate:

  1. metadata game tersimpan yang diteruskan ke callback yang diteruskan ke salah satu panggilan Terbuka.
  2. pembaruan yang akan dilakukan pada metadata.
  3. array data byte yang sebenarnya
  4. callback untuk memanggil saat commit selesai.
    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;
    }

Membaca game tersimpan

Setelah file game tersimpan dibuka, file tersebut dapat dibaca untuk memuat status game. Ini dilakukan dengan memanggil 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
        }
    }

Menghapus game tersimpan

Setelah file game tersimpan dibuka, file tersebut dapat dihapus. Ini dilakukan dengan memanggil 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
        }
    }