قوائم الصدارة في ألعاب Unity

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

قبل البدء

ابدأ بإعداد مشروع Unity والمكوّن الإضافي "ألعاب Google Play" من أجل Unity. بالنسبة التفاصيل، راجِع دليل البدء.

إنشاء أحداث

يمكنك إنشاء قوائم الصدارة في Google Play Console. للحصول على التفاصيل، يمكنك مراجعة دليل لوحات الصدارة "خدمات ألعاب Play". بعد إنشاء لوحة صدارة، يمكنك إضافة مورد Android المخصّص لها إلى المكون الإضافي كما هو موضح في دليل البدء.

نشر نتيجة في قائمة الصدارة

لنشر نتيجة في قائمة الصدارة، يُرجى الاتصال بالموقع الإلكتروني Social.ReportScore.

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Post score 12345 to leaderboard ID "Cfji293fjsie_QA")
    Social.ReportScore(12345, "Cfji293fjsie_QA", (bool success) => {
        // Handle success or failure
    });

لنشر نتيجة وتضمين علامة بيانات وصفية، استخدِم مثيل PlayGamesPlatform مباشرةً:

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Post score 12345 to leaderboard ID "Cfji293fjsie_QA" and tag "FirstDaily")
    PlayGamesPlatform.Instance.ReportScore(12345, "Cfji293fjsie_QA", "FirstDaily", (bool success) => {
        // Handle success or failure
    });

يُرجى العلم أنّ المنصة والخادم سيتجاهلان تلقائيًا النتائج أقل من أعلى نتيجة حالية للاعب، لذا يمكنك إرسال النتائج بحرية بدون أي عمليات تحقق لاختبار ما إذا كانت النتيجة أكبر من نتيجة اللاعب والنتيجة الحالية.

عرض واجهة مستخدم ليدربورد

لعرض واجهة المستخدم المدمجة لجميع قوائم الصدارة، يمكنك طلب Social.ShowLeaderboardUI.

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Show leaderboard UI
    Social.ShowLeaderboardUI();

إذا كنت تريد عرض لوحة صدارة معينة بدلاً من جميع لوحات الصدارة، تمرير رقم تعريف لوحة الصدارة إلى الطريقة ولكن، هذا الإصدار من "ألعاب Play" الإضافة، لذا يجب تحويل العنصر Social.Active إلى PlayGamesPlatform الكائن أولاً:

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Show leaderboard UI
    PlayGamesPlatform.Instance.ShowLeaderboardUI("Cfji293fjsie_QA");

الوصول إلى بيانات "ليدربورد"

هناك طريقتان لاسترداد بيانات نتائج لوحة الصدارة.

استخدام Social.ILeaderboard

تستخدم هذه الطريقة واجهة ILeaderboard لتحديد النطاق والفلاتر للحصول على البيانات. ويسمح لك هذا الأسلوب بضبط ما يلي: 1- رقم تعريف لوحة الصدارة 2- المجموعة (الشبكات الاجتماعية أو العلنية) 3- الإطار الزمني (يوميًا أو أسبوعيًا أو طوال الوقت) 4- تمثّل هذه السمة موضع الترتيب الذي يمكن استخدامه لبدء الحصول على النتائج. 5. عدد النتائج (القيمة التلقائية هي 25). 6. الفلترة حسب رقم تعريف المستخدم

إذا كانت المعلمة from غير موجبة، فإن النتائج التي تم عرضها هي متمركز حول اللاعب، أي أن النتائج حول نتيجة اللاعب الحالي تكون عاد.

    ILeaderboard lb = PlayGamesPlatform.Instance.CreateLeaderboard();
    lb.id = "MY_LEADERBOARD_ID";
    lb.LoadScores(ok =>
        {
            if (ok) {
                LoadUsersAndDisplay(lb);
            }
            else {
                Debug.Log("Error retrieving leaderboardi");
            }
        });

استخدام PlayGamesPlatform.LoadScores()

تستخدم هذه الطريقة الدالة PlayGamesPlatform مباشرةً، ما يوفّر بيانات والمرونة والمعلومات عند الوصول إلى بيانات لوحة الصدارة.

    PlayGamesPlatform.Instance.LoadScores(
            GPGSIds.leaderboard_leaders_in_smoketesting,
            LeaderboardStart.PlayerCentered,
            100,
            LeaderboardCollection.Public,
            LeaderboardTimeSpan.AllTime,
            (data) =>
            {
                mStatus = "Leaderboard data valid: " + data.Valid;
                mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
            });

معلمات LoadScores() هي:

  1. رقم تعريف لوحة الصدارة
  2. موضع البداية (أعلى النتائج أو توسيط اللاعبين)
  3. عدد الصفوف
  4. مجموعة قوائم الصدارة (الشبكات الاجتماعية أو العلنية)
  5. الفترة الزمنية (يوميًا، أسبوعيًا، طوال الوقت)
  6. طلب معاودة الاتصال يقبل كائن LeaderboardScoreData

تُستخدم الفئة LeaderboardScoreData لعرض المعلومات التي تعود إلى المتصل أثناء تحميل النتائج. الأعضاء هم: 1- رقم التعريف - رقم تعريف لوحة الصدارة 2- صالحة - صحيح إذا كانت البيانات التي تم إرجاعها صالحة (تم الاتصال بنجاح) 3- الحالة - ResponseStatus للمكالمة 4- العدد التقريبي - العدد التقريبي للنتائج في قائمة الصدارة 5- العنوان - عنوان لوحة الصدارة 6- PlayerScore - نتيجة اللاعب الحالي 7- النتائج - قائمة النتائج 8- PrevPageToken - رمز مميز يمكن استخدامه لطلب LoadMoreScores() من أجل في الصفحة السابقة من النتائج. 9. NextPageToken - رمز مميز يمكن استخدامه لطلب LoadMoreScores() في الصفحة التالية من النتائج.

    void GetNextPage(LeaderboardScoreData data)
    {
        PlayGamesPlatform.Instance.LoadMoreScores(data.NextPageToken, 10,
            (results) =>
            {
                mStatus = "Leaderboard data valid: " + data.Valid;
                mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
            });
    }

قد يتعذّر إتمام هذه المكالمة عند محاولة تحميل معلومات الأصدقاء باستخدام ResponseCode.ResolutionRequired إذا لم يشارك المستخدم قائمة أصدقائه مع اللعبة. في هذه الحالة، استخدِم AskForLoadFriendsResolution لطلب. الوصول إليه.

الحصول على أسماء اللاعبين

تحتوي كل نتيجة على userId للاعب الذي أحرز النتيجة. يمكنك استخدام Social.LoadUsers() لتحميل الملف الشخصي للّاعب. تذكر أن محتويات للملف الشخصي للّاعب خاضعة لإعدادات الخصوصية لدى اللاعبين.

    internal void LoadUsersAndDisplay(ILeaderboard lb)
    {
        // Get the user ids
        List<string> userIds = new List<string>();

        foreach(IScore score in lb.scores) {
            userIds.Add(score.userID);
        }
        // Load the profiles and display (or in this case, log)
        Social.LoadUsers(userIds.ToArray(), (users) =>
            {
                string status = "Leaderboard loading: " + lb.title + " count = " +
                    lb.scores.Length;
                foreach(IScore score in lb.scores) {
                    IUserProfile user = FindUser(users, score.userID);
                    status += "\n" + score.formattedValue + " by " +
                        (string)(
                            (user != null) ? user.userName : "**unk_" + score.userID + "**");
                }
                Debug.log(status);
            });
    }