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

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

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

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

رویدادها را ایجاد کنید

شما تابلوهای امتیازات را در کنسول Google Play ایجاد می کنید. برای جزئیات، به راهنمای تابلوهای امتیازات برای خدمات بازی‌های 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
    });

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

نمایش رابط کاربری Leaderboard

برای نشان دادن رابط کاربری داخلی برای همه تابلوهای امتیازات، 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");

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

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

از 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. وضعیت - وضعیت پاسخ تماس 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 برای درخواست دسترسی استفاده کنید.

دریافت اسامی بازیکنان

هر امتیاز دارای شناسه کاربری بازیکنی است که امتیاز را ایجاد کرده است. می توانید از 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);
            });
    }