Papan peringkat di game Unity

Topik ini menjelaskan cara menggunakan papan peringkat Layanan game Play dalam game Unity.

Sebelum memulai

Siapkan project Unity Anda dan plugin Google Play Game untuk Unity. Untuk mengetahui detailnya, lihat Panduan memulai.

Membuat peristiwa

Anda dapat membuat papan peringkat di Konsol Google Play. Untuk mengetahui detailnya, lihat panduan papan peringkat untuk Layanan game Play. Setelah membuat papan peringkat, tambahkan resource Android tersebut ke plugin seperti yang dijelaskan dalam panduan memulai.

Memposting Skor ke Papan Peringkat

Untuk memposting skor ke papan peringkat, panggil 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
    });

Untuk memposting skor dan menyertakan tag metadata, gunakan instance PlayGamesPlatform secara langsung:

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

Perlu diperhatikan bahwa platform dan server akan otomatis menghapus skor yang lebih rendah daripada skor tertinggi pemain yang sudah ada, sehingga Anda dapat mengirimkan skor dengan bebas tanpa perlu memeriksa apakah skor lebih besar daripada skor pemain yang sudah ada.

Menampilkan UI Papan Peringkat

Untuk menampilkan UI bawaan bagi semua papan peringkat, panggil Social.ShowLeaderboardUI.

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

Jika ingin menampilkan papan peringkat tertentu, bukan semua papan peringkat, Anda dapat meneruskan ID papan peringkat ke metode tersebut. Namun, ini adalah ekstensi Play Game, sehingga objek Social.Active perlu ditransmisikan ke objek PlayGamesPlatform terlebih dahulu:

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

Mengakses data Papan Peringkat

Ada 2 metode untuk mengambil data skor papan peringkat.

Menggunakan Social.ILeaderboard

Metode ini menggunakan antarmuka ILeaderboard untuk menentukan cakupan dan filter guna mendapatkan data. Pendekatan ini memungkinkan Anda mengonfigurasi: 1. ID papan peringkat 2. Koleksi (sosial atau publik) 3. Jangka waktu (harian, mingguan, sepanjang waktu) 4. Posisi peringkat untuk mulai mengambil skor. 5. Jumlah skor (defaultnya adalah 25). 6. Filter menurut ID pengguna.

Jika parameter dari non-positif, hasil yang ditampilkan akan berpusat pada pemain, yang berarti skor di sekitar skor pemain saat ini akan ditampilkan.

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

Menggunakan PlayGamesPlatform.LoadScores()

Metode ini menggunakan PlayGamesPlatform secara langsung, yang memberikan fleksibilitas dan informasi tambahan saat mengakses data papan peringkat.

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

Parameter untuk LoadScores() adalah:

  1. leaderboardId
  2. posisi awal (skor atau pemain teratas di posisi tengah)
  3. jumlah baris
  4. koleksi papan peringkat (sosial atau publik)
  5. rentang waktu (harian, mingguan, sepanjang waktu)
  6. callback yang menerima objek LeaderboardScoreData.

Class LeaderboardScoreData digunakan untuk menampilkan informasi kembali ke pemanggil saat memuat skor. Anggotanya adalah: 1. ID - ID papan peringkat 2. Valid - benar jika data yang ditampilkan valid (panggilan berhasil) 3. Status - ResponseStatus panggilan 4. ApproximateCount - perkiraan jumlah skor di papan peringkat 5. Judul - judul papan peringkat 6. PlayerScore - skor pemain saat ini 7. Skor - daftar skor 8. PrevPageToken - token yang dapat digunakan untuk memanggil LoadMoreScores() guna mendapatkan halaman skor sebelumnya. 9. NextPageToken - token yang dapat digunakan untuk memanggil LoadMoreScores() guna mendapatkan halaman skor berikutnya.

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

Panggilan ini mungkin gagal saat mencoba memuat teman dengan ResponseCode.ResolutionRequired jika pengguna belum membagikan daftar teman mereka dengan game. Dalam hal ini, gunakan AskForLoadFriendsResolution untuk meminta akses.

Mendapatkan nama pemain

Setiap skor memiliki userId pemain yang membuat skor. Anda dapat menggunakan Social.LoadUsers() untuk memuat profil pemain. Ingat bahwa konten profil pemain tunduk pada setelan privasi pemain.

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