الألعاب المحفوظة في ألعاب Unity

يوضّح هذا الموضوع كيفية استخدام الألعاب المحفوظة في "خدمات ألعاب Play" في Unity. الألعاب.

قبل البدء

  • ابدأ بإعداد مشروعك والمكوّن الإضافي "ألعاب Google 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
        }
    }

فتح لعبة محفوظة

لقراءة البيانات أو كتابتها في لعبة محفوظة، يجب تحديد فُتِحَ لأنّ حالة اللعبة المحفوظة يتم تخزينها مؤقتًا على الجهاز وحفظها في السحابة، من الممكن مواجهة تعارض في حالة البيانات المحفوظة. يحدث التعارض عندما يحاول أحد الأجهزة حفظ الحالة في السحابة الإلكترونية ولكن البيانات الموجودة على السحابة حاليًا من قبل جهاز مختلف. هذه التعارضات يجب حلها عند فتح بيانات اللعبة المحفوظة.

هناك طريقتان مفتوحتان للتعامل مع حل الخلافات، وهما الطريقة الأولى تقبل الدالة OpenWithAutomaticCONtion استراتيجية الدقة العادية. الكتابة وحل التعارضات تلقائيًا. الطريقة الأخرى، تقبل الدالة OpenWith manual ConResolution طريقة معاودة الاتصال للسماح بما يلي: الحل اليدوي للتضارب.

راجِع 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. معاودة الاتصال للاتصال عند اكتمال الالتزام.
    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
        }
    }

حذف لعبة محفوظة

بعد فتح ملف اللعبة المحفوظ، يمكنك حذفه. يتم ذلك من خلال استدعاء حذف.

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