ลีดเดอร์บอร์ดในเกม Unity

หัวข้อนี้จะอธิบายวิธีใช้ลีดเดอร์บอร์ดของบริการเกมของ Play ในเกม Unity

ก่อนเริ่มต้นใช้งาน

ตั้งค่าโปรเจ็กต์ Unity และปลั๊กอิน Google Play Games สำหรับ Unity โปรดดูรายละเอียดที่คู่มือเริ่มต้นใช้งาน

สร้างกิจกรรม

คุณสร้างลีดเดอร์บอร์ดได้ใน Google Play Console โปรดดูรายละเอียดที่คู่มือเกี่ยวกับตารางอันดับสำหรับบริการ Play Games หลังจากสร้างตารางอันดับแล้ว ให้เพิ่มทรัพยากร 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
    });

โปรดทราบว่าแพลตฟอร์มและเซิร์ฟเวอร์จะทิ้งคะแนนที่ต่ำกว่าคะแนนสูงสุดที่มีอยู่ของผู้เล่นโดยอัตโนมัติ คุณจึงส่งคะแนนได้อย่างอิสระโดยไม่ต้องมีการตรวจสอบเพื่อดูว่าคะแนนสูงกว่าคะแนนที่มีอยู่ของผู้เล่นหรือไม่

แสดง UI ของลีดเดอร์บอร์ด

หากต้องการแสดง UI ในตัวสำหรับลีดเดอร์บอร์ดทั้งหมด ให้เรียกใช้ 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. leaderboardId
  2. ตำแหน่งเริ่มต้น (คะแนนสูงสุดหรือผู้เล่นที่กึ่งกลาง)
  3. จํานวนแถว
  4. คอลเล็กชันลีดเดอร์บอร์ด (โซเชียลหรือสาธารณะ)
  5. ระยะเวลา (รายวัน รายสัปดาห์ ตลอดกาล)
  6. ฟังก์ชัน Callback ที่รับออบเจ็กต์ LeaderboardScoreData

คลาส LeaderboardScoreData ใช้เพื่อแสดงผลข้อมูลกลับไปยังผู้เรียกใช้เมื่อโหลดคะแนน สมาชิกมีดังนี้ 1. รหัส - รหัสลีดเดอร์บอร์ด 2. ถูกต้อง - จริงหากข้อมูลที่แสดงผลถูกต้อง (การเรียกใช้สำเร็จ) 3. สถานะ - ResponseStatus ของการเรียก 4. ApproximateCount - จำนวนคะแนนโดยประมาณในลีดเดอร์บอร์ด 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);
            });
    }