Unity oyunlarında skor tabloları

Bu makalede, Unity oyunlarında Play Games Hizmetleri liderlik tablolarının nasıl kullanılacağı açıklanmaktadır.

Başlamadan önce

Unity projenizi ve Unity için Google Play Games eklentisini ayarlayın. Ayrıntılı bilgi için Başlangıç kılavuzunu inceleyin.

Etkinlik oluşturma

Google Play Console'da skor tabloları oluşturursunuz. Ayrıntılar için Play Games Hizmetleri'nin puan tabloları kılavuzuna bakın. Bir liderlik tablosu oluşturduktan sonra, Android kaynağını başlangıç kılavuzunda açıklandığı şekilde eklenti içine ekleyin.

Skor tablosunda skor yayınlama

Bir skor tablosunda skor yayınlamak için Social.ReportScore işlevini çağırın.

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Post score 12345 to leaderboard ID "Cfji293fjsie_QA")
    Social.ReportScore(12345, "Cfji293fjsie_QA", (bool success) => {
        // Handle success or failure
    });

Puan yayınlamak ve meta veri etiketi eklemek için doğrudan bir PlayGamesPlatform örneği kullanın:

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

Platform ve sunucunun, oyuncunun mevcut en yüksek puanından düşük puanları otomatik olarak atacağını unutmayın. Bu nedenle, puanların oyuncunun mevcut puanından daha yüksek olup olmadığını kontrol etmek için herhangi bir kontrol yapmadan puanları özgürce gönderebilirsiniz.

Skor tablosu kullanıcı arayüzünü gösterme

Tüm skor tabloları için yerleşik kullanıcı arayüzünü göstermek üzere Social.ShowLeaderboardUI işlevini çağırın.

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

Tüm leaderboard'lar yerine belirli bir leaderboard'u göstermek istiyorsanız yönteme bir leaderboard kimliği iletebilirsiniz. Ancak bu bir Play Games uzantısı olduğundan Social.Active nesnesinin önce bir PlayGamesPlatform nesnesine atanması gerekir:

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

Skor tablosu verilerine erişme

Liderler tablosu puan verilerini almak için 2 yöntem vardır.

Social.ILeaderboard'ı kullanma

Bu yöntem, verileri almak için kapsamı ve filtreleri tanımlamak amacıyla ILeaderboard arayüzünü kullanır. Bu yaklaşımla şunları yapılandırabilirsiniz: 1. Skor tablosu kimliği 2. Koleksiyon (sosyal veya herkese açık) 3. Zaman aralığı (günlük, haftalık, tüm zamanlar) 4. Puanları almaya başlanacak sıralama konumu. 5. Puan sayısı (varsayılan değer 25'tir). 6. Kullanıcı kimliğine göre filtreleyin.

from parametresi pozitif değilse döndürülen sonuçlar oyuncuya odaklanır. Yani, mevcut oyuncunun puanına yakın puanlar döndürülür.

    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() işlevini kullanma

Bu yöntem, PlayGamesPlatform'ü doğrudan kullanır. Bu sayede, lider tablosu verilerine erişirken ek esneklik ve bilgi elde edilir.

    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() işlevinin parametreleri şunlardır:

  1. leaderboardId
  2. başlangıç konumu (en yüksek puanlar veya oyuncu merkezli)
  3. satır sayısı
  4. skor tablosu koleksiyonu (sosyal veya herkese açık)
  5. zaman aralığı (günlük, haftalık, tüm zamanlar)
  6. LeaderboardScoreData nesnesi kabul eden geri çağırma işlevi.

LeaderboardScoreData sınıfı, puanlar yüklenirken bilgileri arayan kullanıcıya döndürmek için kullanılır. Üyeler: 1. Kimlik: Skor tablosu kimliği 2. Valid: Döndürülen veriler geçerliyse (çağrı başarılıysa) doğru değerini döndürür. 3. Durum: Aramanın ResponseStatus değeri 4. ApproximateCount: Skor tablosundaki yaklaşık skor sayısı 5. Başlık: Liderlik tablosunun başlığı 6. PlayerScore: Mevcut oyuncunun puanı 7. Puanlar: Puanların listesi 8. PrevPageToken: Puanların önceki sayfasını almak için LoadMoreScores()'ü çağırmak üzere kullanılabilecek bir jeton. 9. NextPageToken: Puanların bir sonraki sayfasını almak için LoadMoreScores()'ü çağırmak üzere kullanılabilen bir jeton.

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

Kullanıcı, arkadaş listesini oyunla paylaşmadıysa bu çağrı, ResponseCode.ResolutionRequired ile arkadaş yüklenmeye çalışılırken başarısız olabilir. Bu durumda, erişim isteğinde bulunmak için AskForLoadFriendsResolution değerini kullanın.

Oyuncu adlarını alma

Her puanda, puanı alan oyuncunun userId değeri bulunur. Oyuncu profilini yüklemek için Social.LoadUsers() öğesini kullanabilirsiniz. Oyuncu profilinin içeriğinin, oyuncuların gizlilik ayarlarına tabi olduğunu unutmayın.

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