Unity oyunlarında kayıtlı oyunlar

Bu konularda, Unity oyunlarında Play Games Hizmetleri için kaydedilen oyunların nasıl kullanılacağı açıklanmaktadır.

Başlamadan önce

Kaydedilmiş oyunlar kullanıcı arayüzünü görüntüle

Kaydedilmiş bir oyun girişini seçmek veya oluşturmak için kullanılan standart kullanıcı arayüzü şu çağrıyla gösterilir:

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

Kaydedilmiş bir oyunu açma

Kaydedilmiş bir oyuna veri okumak veya yazmak için kayıtlı oyunun açılmış olması gerekir. Kaydedilen oyun durumu cihazda yerel olarak önbelleğe alınıp buluta kaydedildiğinden, kaydedilen verilerin durumunda çakışmalar yaşanabilir. Bir cihaz, durumu buluta kaydetmeye çalıştığında ancak hâlihazırda bulutta bulunan veriler farklı bir cihaz tarafından yazıldığında çakışma meydana gelir. Bu çakışmaların, kayıtlı oyun verileri açılırken çözülmesi gerekir.

Çakışma çözümlemesini ele alan 2 açık yöntem vardır. İlki OpenWithautomatedOverlayResolution yöntemi standart çözüm stratejisi türünü kabul eder ve çakışmaları otomatik olarak çözer. Diğer OpenWithManualMultipleResolution yöntemi, çakışmanın manuel olarak çözülmesine olanak tanıyan bir geri çağırma yöntemini kabul eder.

Bu yöntemler hakkında daha fazla bilgi edinmek için GooglePlayGames/BasicApi/saveGame/ISupportedGameClient.cs adresini ziyaret edebilirsiniz.

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

Kaydedilmiş bir oyunu yazma

Kaydedilen oyun dosyası açıldıktan sonra oyun durumunu kaydetmek için yazılabilir. Bu işlem CommitUpdate çağrısıyla gerçekleştirilir. CommitUpdate için kullanılan dört parametre vardır:

  1. kaydedilen oyun meta verilerinin, Open çağrılardan birine iletilen geri çağırmaya aktarıldığı belirtildi.
  2. ve meta verilerde yapılacak güncellemeleri inceleyeceğiz.
  3. verinin gerçek baytlık dizisi
  4. kaydetme işlemi tamamlandığında çağrıya dönüşecek bir geri çağırma.
    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;
    }

Kaydedilmiş bir oyunu okuma

Kaydedilmiş oyun dosyası açıldıktan sonra oyun durumunu yüklemek için okunabilir. Bu işlem, ReadBinaryData çağrısıyla gerçekleştirilir.

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

Kaydedilmiş bir oyunu silme

Kaydedilen oyun dosyası açıldıktan sonra silinebilir. Bunu, Sil işlevini çağırarak yapabilirsiniz.

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