ইউনিটি গেমে লিডারবোর্ড

এই আলোচনায় ইউনিটি গেমে প্লে গেমস সার্ভিসেস লিডারবোর্ড কীভাবে ব্যবহার করতে হয় তা বর্ণনা করা হয়েছে।

শুরু করার আগে

আপনার ইউনিটি প্রজেক্ট এবং ইউনিটির জন্য গুগল প্লে গেমস প্লাগইনটি সেট আপ করুন। বিস্তারিত জানতে, ‘ গেট স্টার্টেড’ গাইডটি দেখুন।

ইভেন্ট তৈরি করুন

আপনি গুগল প্লে কনসোলে লিডারবোর্ড তৈরি করেন। বিস্তারিত জানতে, প্লে গেমস সার্ভিসেস-এর লিডারবোর্ড গাইডটি দেখুন। একটি লিডারবোর্ড তৈরি করার পর, গেট স্টার্টেড গাইডে বর্ণিত পদ্ধতি অনুযায়ী এর অ্যান্ড্রয়েড রিসোর্সটি প্লাগইনে যোগ করুন।

লিডারবোর্ডে একটি স্কোর পোস্ট করুন

লিডারবোর্ডে স্কোর পোস্ট করতে 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
    });

মনে রাখবেন যে, প্ল্যাটফর্ম এবং সার্ভার খেলোয়াড়ের বিদ্যমান সর্বোচ্চ স্কোরের চেয়ে কম স্কোরগুলো স্বয়ংক্রিয়ভাবে বাতিল করে দেবে, তাই স্কোরটি খেলোয়াড়ের বিদ্যমান স্কোরের চেয়ে বেশি কি না, তা যাচাই করার কোনো পরীক্ষা ছাড়াই আপনি নিশ্চিন্তে স্কোর জমা দিতে পারেন।

লিডারবোর্ড UI দেখান

সকল লিডারবোর্ডের বিল্ট-ইন UI দেখানোর জন্য, Social.ShowLeaderboardUI কল করুন।

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

আপনি যদি সমস্ত লিডারবোর্ডের পরিবর্তে একটি নির্দিষ্ট লিডারবোর্ড দেখাতে চান, তাহলে আপনি মেথডটিতে একটি লিডারবোর্ড আইডি পাস করতে পারেন। তবে, এটি প্লে গেমস-এর একটি এক্সটেনশন, তাই প্রথমে Social.Active অবজেক্টটিকে একটি PlayGamesPlatform অবজেক্টে কাস্ট করতে হবে:

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

লিডারবোর্ডের ডেটা অ্যাক্সেস করুন

লিডারবোর্ডের স্কোর ডেটা পুনরুদ্ধার করার ২টি পদ্ধতি রয়েছে।

সোশ্যাল.আইলিডারবোর্ড ব্যবহার করুন

এই পদ্ধতিটি ডেটা পাওয়ার জন্য পরিধি এবং ফিল্টার নির্ধারণ করতে 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.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 ব্যবহার করুন।

খেলোয়াড়দের নাম সংগ্রহ করুন

প্রতিটি স্কোরের সাথে স্কোরকারী খেলোয়াড়ের ইউজার আইডি থাকে। আপনি খেলোয়াড়ের প্রোফাইল লোড করতে 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);
            });
    }