Bảng xếp hạng trong trò chơi Unity

Chủ đề này mô tả cách sử dụng bảng xếp hạng Dịch vụ trò chơi của Play trong các trò chơi Unity.

Trước khi bạn bắt đầu

Thiết lập dự án Unity và trình bổ trợ Google Play Games cho Unity. Để biết thông tin chi tiết, vui lòng xem Hướng dẫn bắt đầu sử dụng.

Tạo sự kiện

Bạn hãy tạo bảng xếp hạng trong Google Play Console. Để biết thông tin chi tiết, vui lòng xem hướng dẫn về bảng xếp hạng đối với Dịch vụ trò chơi của Play. Sau khi tạo bảng xếp hạng, bạn hãy thêm tài nguyên Android vào trình bổ trợ như mô tả trong hướng dẫn bắt đầu.

Đăng điểm số lên bảng xếp hạng

Để đăng một điểm số lên một bảng xếp hạng, hãy gọi 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
    });

Để đăng một điểm số có chứa một thẻ siêu dữ liệu, hãy sử dụng trực tiếp thực thể 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
    });

Lưu ý rằng nền tảng này và máy chủ sẽ tự động loại bỏ những điểm số thấp hơn mức điểm cao hiện tại của người chơi. Do vậy, bạn có thể thoải mái gửi điểm số mà không cần phải kiểm tra xem liệu nó có cao hơn điểm số hiện tại của người chơi hay không.

Hiển thị giao diện người dùng Bảng xếp hạng

Để hiển thị giao diện người dùng tích hợp sẵn cho tất cả các bảng xếp hạng, hãy gọi social.ShowTableUI.

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

Nếu muốn hiện một bảng xếp hạng cụ thể thay vì tất cả các bảng xếp hạng, bạn có thể truyền một giá trị nhận dạng bảng xếp hạng vào phương thức. Tuy nhiên, đây là một tiện ích của Play Games nên trước tiên, đối tượng Social.Active cần được truyền cho đối tượng PlayGamesPlatform:

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

Truy cập vào dữ liệu Bảng xếp hạng

Có 2 cách để truy xuất dữ liệu điểm số trên bảng xếp hạng.

Sử dụng Social.ILeaderboard

Phương thức này sử dụng giao diện ILeaderboard để xác định phạm vi và bộ lọc nhằm lấy dữ liệu. Phương pháp này cho phép bạn định cấu hình: 1. Mã bảng xếp hạng 2. Bộ sưu tập (xã hội hoặc công khai) 3. Khung thời gian (theo ngày, theo tuần, toàn thời gian) 4. Vị trí xếp hạng để bắt đầu truy xuất điểm số. 5. Số điểm (mặc định là 25). 6. Lọc theo mã khách hàng.

Nếu tham số from không dương, thì kết quả trả về sẽ lấy người chơi làm trung tâm, nghĩa là các điểm xung quanh điểm của người chơi hiện tại sẽ được trả về.

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

Sử dụng PlayGamesPlatform.LoadScores()

Phương thức này sử dụng trực tiếp PlayGamesPlatform để mang lại thêm thông tin và tính linh hoạt khi truy cập vào dữ liệu bảng xếp hạng.

    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;
            });

Các tham số cho LoadScores() là:

  1. Mã bảng xếp hạng
  2. vị trí bắt đầu (điểm số cao nhất hoặc người chơi ở giữa)
  3. số hàng
  4. bộ sưu tập bảng xếp hạng (xã hội hoặc công khai)
  5. khoảng thời gian (theo ngày, theo tuần, toàn thời gian)
  6. lệnh gọi lại chấp nhận đối tượng LeaderboardScoreData.

Lớp LeaderboardScoreData được dùng để trả lại thông tin cho trình gọi khi tải điểm số. Các thành viên là: 1. Mã – mã bảng xếp hạng 2. Valid – giá trị là true nếu dữ liệu được trả về hợp lệ (lệnh gọi thành công) 3. Status – Trạng thái phản hồi của lệnh gọi 4. ApproximateCount – số điểm gần đúng trong bảng xếp hạng 5. Title – tiêu đề của bảng xếp hạng 6. PlayerScore – điểm số của người chơi hiện tại 7. Scores – danh sách điểm số 8. PrevPageToken – một mã thông báo được dùng khi gọi LoadMoreScores() để lấy trang điểm số trước đó. 9. NextPageToken – một mã thông báo được dùng khi gọi LoadMoreScores() để nhận trang tiếp theo của điểm số.

    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;
            });
    }

Lệnh gọi này có thể không thực hiện được khi cố gắng tải bạn bè bằng ResponseCode.ResolutionRequired, nếu người dùng chưa chia sẻ danh sách bạn bè của họ với trò chơi đó. Trong trường hợp này, hãy sử dụng AskForLoadFriendsResolution để yêu cầu quyền truy cập.

Tải tên người chơi

Mỗi điểm số đều có userId (mã người chơi) của người chơi tạo ra điểm số đó. Bạn có thể sử dụng Social.LoadUsers() để tải hồ sơ người chơi. Hãy luôn nhớ nội dung trong hồ sơ người chơi phải tuân theo chế độ cài đặt quyền riêng tư của người chơi.

    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);
            });
    }