بازی های ذخیره شده در بازی های یونیتی

این مبحث نحوه استفاده از بازی‌های ذخیره‌شده برای خدمات بازی‌های Play در بازی‌های Unity را شرح می‌دهد.

قبل از شروع

نمایش رابط کاربری بازی های ذخیره شده

رابط کاربری استاندارد برای انتخاب یا ایجاد یک ورودی بازی ذخیره شده با فراخوانی نمایش داده می شود:

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

باز کردن یک بازی ذخیره شده

برای خواندن یا نوشتن داده ها در یک بازی ذخیره شده، بازی ذخیره شده باید باز شود. از آنجایی که حالت ذخیره شده بازی به صورت محلی در دستگاه ذخیره می شود و در فضای ابری ذخیره می شود، ممکن است در وضعیت داده های ذخیره شده با تداخل مواجه شوید. تضاد زمانی اتفاق می‌افتد که دستگاهی تلاش می‌کند وضعیت را در فضای ابری ذخیره کند اما داده‌های موجود در ابر توسط دستگاه دیگری نوشته شده است. این تضادها باید هنگام باز کردن اطلاعات ذخیره شده بازی حل شوند.

2 روش باز وجود دارد که حل تعارض را مدیریت می کند، OpenWithAutomaticConflictResolution اول یک نوع استراتژی حل استاندارد را می پذیرد و به طور خودکار تضادها را حل می کند. روش دیگر، OpenWithManualConflictResolution یک روش بازگشت به تماس را می پذیرد تا امکان حل دستی تضاد را فراهم کند.

برای جزئیات بیشتر در مورد این روش ها به 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
        }
    }

یک بازی ذخیره شده بنویسید

پس از باز شدن فایل ذخیره شده بازی، می توان آن را برای ذخیره وضعیت بازی نوشت. این کار با فراخوانی CommitUpdate انجام می شود. چهار پارامتر برای CommitUpdate وجود دارد:

  1. فراداده ذخیره شده بازی به تماس برگشتی ارسال شده به یکی از تماس های باز ارسال می شود.
  2. به روز رسانی برای ابرداده
  3. آرایه بایت واقعی داده ها
  4. یک تماس برای تماس پس از اتمام commit.
    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;
    }

یک بازی ذخیره شده را بخوانید

پس از باز شدن فایل ذخیره شده بازی، می توان آن را برای بارگیری وضعیت بازی خواند. این کار با فراخوانی 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
        }
    }

حذف یک بازی ذخیره شده

پس از باز شدن فایل ذخیره شده بازی، می توان آن را حذف کرد. این کار با فراخوانی 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
        }
    }