الألعاب المحفوظة في ألعاب 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
        }
    }

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

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

هناك طريقتان مفتوحتان للتعامل مع حل التعارض، الأولى OpenWithAutomaticConflictResolution تقبل استراتيجية حل قياسية وتحل التعارضات تلقائيًا. تتلقّى الطريقة الأخرى، OpenWithManualConflictResolution، طريقة ردّ اتصال للسماح بحلّ التعارض يدويًا.

يمكنك الاطّلاع على 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. البيانات الوصفية للعبة المحفوظة التي تم تمريرها إلى دالة معاودة الاتصال التي تم تمريرها إلى إحدى دوال Open
  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
        }
    }