Unity oyunlarında kayıtlı oyunlar

Bu makalede, Unity oyunlarında Play Oyun Hizmetleri için kayıtlı oyunların nasıl kullanılacağı açıklanmaktadır.

Başlamadan önce

Kayıtlı oyunlar kullanıcı arayüzünü görüntüleme

Kayıtlı bir oyun girişini seçmek veya oluşturmak için standart kullanıcı arayüzü şu şekilde çağrılır:

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

Kayıtlı bir oyunu açma

Kayıtlı bir oyunda veri okumak veya yazmak için kayıtlı oyunun açılması gerekir. Kayıtlı oyun durumu cihazda yerel olarak önbelleğe alınıp buluta kaydedildiğinden, kayıtlı verilerin durumunda çakışmalarla karşılaşabilirsiniz. Bir cihaz buluta durum kaydetmeye çalışırken bulutta bulunan veriler farklı bir cihaz tarafından yazılmışsa çakışma meydana gelir. Kayıtlı oyun verileri açıldığında bu çakışmaların çözülmesi gerekir.

Çakışma çözümünü yöneten 2 açık yöntem vardır. İlk yöntem olan OpenWithAutomaticConflictResolution, standart bir çözüm stratejisi türünü kabul eder ve çakışmaları otomatik olarak çözer. Diğer yöntem olan OpenWithManualConflictResolution, çakışmanın manuel olarak çözülmesine olanak tanımak için bir geri çağırma yöntemi kabul eder.

Bu yöntemlerle ilgili daha fazla bilgi için GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs dosyasını inceleyin.

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

Kayıtlı bir oyunu yazma

Kayıtlı oyun dosyası açıldıktan sonra oyun durumunu kaydetmek için yazılabilir. Bu işlem, CommitUpdate çağrısı yapılarak gerçekleştirilir. CommitUpdate'in dört parametresi vardır:

  1. Açık çağrılardan birine iletilen geri çağırma işlevine iletilen kayıtlı oyun meta verileri.
  2. meta verilerde yapılacak güncellemeleri belirtin.
  3. Verilerin gerçek bayt dizisi
  4. Taahhüt tamamlandığında çağrılacak bir geri çağırma işlevi.
    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;
    }

Kaydedilen bir oyunu okuma

Kayıtlı oyun dosyası açıldığında oyun durumu yüklenmek için okunabilir. Bu işlem, ReadBinaryData çağrılarak yapılır.

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

Kayıtlı bir oyunu silme

Kayıtlı oyun dosyası açıldıktan sonra silinebilir. Bu işlem, Sil işlevi çağrılarak yapılır.

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