Unity oyunlarında skor tabloları

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

Başlamadan önce

Unity projenizi ve Unity için Google Play Games eklentisini oluşturun. Ayrıntılar için Başlangıç kılavuzuna bakın.

Etkinlik oluşturma

Skor tabloları Google Play Console'da oluşturulur. Ayrıntılar için Play Games Hizmetleri skor tablosu kılavuzunu inceleyin. Bir skor tablosu oluşturduktan sonra, skor tablosunun Android kaynağını başlangıç kılavuzunda açıklandığı gibi eklentiye ekleyin.

Skor Tablosunda Skor Yayınlama

Bir skor tablosunda skor yayınlamak için Social.ReportScore hizmetini ç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
    });

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

Platformun ve sunucunun, oyuncunun mevcut rekorundan düşük puanları otomatik olarak sileceğini unutmayın. Böylece, skorun oyuncunun mevcut puanından yüksek olup olmadığını test etmek için hiçbir kontrol yapmadan skorları serbestçe gönderebilirsiniz.

Leaderboard kullanıcı arayüzünü göster

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

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

Tüm skor tabloları yerine belirli bir skor tablosunu göstermek isterseniz yönteme skor tablosu kimliği aktarabilirsiniz. Ancak bu, bir Play Games uzantısı olduğundan Social.Active nesnesinin önce bir PlayGamesPlatform nesnesine yayınlanması gerekir:

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

Leaderboard verilerine erişme

Skor tablosu puan verilerini almanın 2 yöntemi vardır.

Social.ILeaderboard kullanın

Bu yöntem, verileri almak için kapsamı ve filtreleri tanımlamak üzere 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. Skor alınmaya başlanacak sıralama konumu. 5. Puan sayısı (varsayılan değer 25'tir). 6. Kullanıcı kimliğine göre filtrele.

From parametresi pozitif değilse döndürülen sonuçlar oyuncu merkezlidir. Diğer bir deyişle, mevcut oyuncunun puanının etrafındaki 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 kullan

Bu yöntem doğrudan PlayGamesPlatform kullanır. Bu da skor tablosu verilerine erişirken daha fazla esneklik ve bilgi sağlar.

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

  1. skor tablosu kimliği
  2. başlangıç konumu (en yüksek skorlar veya oyuncu ortalanmış)
  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. bir LeaderboardScoreData nesnesini kabul eden geri çağırma.

LeaderboardScoreData sınıfı, puanlar yüklenirken arayan kişiye bilgileri geri döndürmek için kullanılır. Üyeler: 1. Kimlik - leaderboard kimliği 2. Geçerli: Döndürülen veriler geçerliyse (çağrı başarılı olduysa) 3. Durum - Aramanın ResponseStatus 4. Yaklaşık Sayı - Skor tablosundaki yaklaşık skor sayısı 5. Başlık - skor tablosunun başlığı 6. PlayerScore - mevcut oyuncunun skoru 7. Puanlar - puanların listesi 8. PrevPageToken: Önceki puan sayfasını almak üzere LoadMoreScores() çağrısında bulunmak için kullanılabilecek bir jeton. 9. NextPageToken: Bir sonraki puan sayfasını almak üzere LoadMoreScores() yöntemini çağırmak için kullanılabilecek bir jetondur.

    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 ResponseCode.ResolutionRequired adlı sağlayıcıyla arkadaşlar yüklenmeye çalışılırken bu çağrı başarısız olabilir. Bu durumda, erişim isteğinde bulunmak için AskForLoadFriendsResolution öğesini kullanın.

Oyuncu adlarını al

Her skor, skoru yapan oyuncunun kullanıcı kimliğini içerir. Oyuncu profilini yüklemek için Social.LoadUsers() kullanabilirsiniz. Oyuncu profili içeriklerinin, 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);
            });
    }