تابلوهای امتیازات در بازی های یونیتی

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

قبل از اینکه شروع کنید

پروژه یونیتی و افزونه Google Play Games را برای یونیتی تنظیم کنید. برای جزئیات بیشتر، به راهنمای شروع به کار مراجعه کنید.

ایجاد رویدادها

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

ارسال امتیاز به جدول امتیازات

برای ارسال امتیاز به جدول امتیازات، از 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 Games است، بنابراین شیء Social.Active ابتدا باید به یک شیء PlayGamesPlatform تبدیل شود:

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

دسترسی به داده‌های جدول امتیازات

دو روش برای بازیابی داده‌های امتیاز جدول امتیازات وجود دارد.

از Social.ILederboard استفاده کنید

این روش از رابط ILeaderboard برای تعریف محدوده و فیلترهای دریافت داده‌ها استفاده می‌کند. این رویکرد به شما امکان پیکربندی موارد زیر را می‌دهد: ۱. شناسه جدول امتیازات ۲. مجموعه (اجتماعی یا عمومی) ۳. بازه زمانی (روزانه، هفتگی، تمام وقت) ۴. موقعیت رتبه برای شروع بازیابی امتیازات ۵. تعداد امتیازات (پیش‌فرض ۲۵ است). ۶. فیلتر بر اساس شناسه کاربر.

اگر پارامتر 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. Id - the leaderboard id
2. Valid - true if the returned data is valid (the call was successful)
3. Status - the ResponseStatus of the call
4. ApproximateCount - the approximate number of scores in the leaderboard
5. Title - the title of the leaderboard
6. PlayerScore - the score of the current player
7. Scores - the list of scores
8. PrevPageToken - a token that can be used to call `LoadMoreScores()` to
    get the previous page of scores.
9. NextPageToken - a token that can be used to call `LoadMoreScores()` to
    get the next page of scores.
    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);
            });
    }