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

این مبحث نحوه استفاده از بازی‌های ذخیره شده برای سرویس‌های Play Games در بازی‌های 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
        }
    }

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

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

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

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

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

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

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