Tabele wyników w grach na Unity

W tym artykule opisujemy, jak korzystać z tabel wyników w usługach gier Play w Unity gry.

Zanim rozpoczniesz

Skonfiguruj projekt w Unity i wtyczkę Gry Google Play dla Unity. Dla: Więcej informacji znajdziesz w przewodniku dla początkujących.

Tworzenie wydarzeń

Tabele wyników możesz tworzyć w Konsoli Google Play. Więcej informacji: przewodnika po tabelach wyników – Usługi gier Play. Po utworzeniu tabeli wyników dodaj jej zasób na Androida zgodnie z opisem w sekcji przewodnika dla początkujących.

Opublikuj wynik w tabeli wyników

Aby opublikować wynik w tabeli wyników, wywołaj 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
    });

Aby opublikować wynik i dodać tag metadanych, użyj instancji PlayGamesPlatform bezpośrednio:

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

Pamiętaj, że platforma i serwer automatycznie odrzucają wyniki, które są jest niższy niż istniejący rekord gracza, więc możesz swobodnie przesyłać wyniki bez sprawdzania, czy wynik jest lepszy od istniejącego wyniku.

Pokaż interfejs tabeli wyników

Aby wyświetlić wbudowany interfejs wszystkich tabel wyników, wywołaj social.ShowleaderUI.

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

Jeśli chcesz wyświetlać konkretną tablicę wyników zamiast wszystkich, wybierz może przekazać do metody identyfikator tabeli wyników. To jest jednak Gry Play, więc obiekt Social.Active musi być rzutowany na PlayGamesPlatform najpierw obiekt:

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

Dostęp do danych w tabeli wyników

Dane o wynikach z tabeli wyników można pobrać na 2 sposoby.

Korzystanie z Social.Itabeli wyników

Ta metoda korzysta z interfejsu Itabela wyników do definiowania zakresu i filtrów który ma pomóc w zebraniu danych. W ten sposób możesz skonfigurować: 1. Identyfikator tabeli wyników 2. kolekcję (społeczną lub publiczną), 3. przedział czasu (dzienny, tygodniowy, od początku); 4. Pozycja, w której rozpoczyna się pobieranie wyników. 5. Liczba wyników (wartość domyślna to 25). 6. Filtruj według identyfikatora użytkownika.

Jeśli parametr from ma wartość niedodatnią, zwracane wyniki są takie jak jest skoncentrowany na graczu, co oznacza, że wyniki aktualnego gracza są .

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

Użyj funkcji PlayGamesPlatform.LoadScores()

Ta metoda korzysta bezpośrednio z metody PlayGamesPlatform, co zapewnia dodatkowe i elastycznością przy korzystaniu z danych tabel wyników.

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

Parametry LoadScores() to:

  1. identyfikator tablicy wyników
  2. pozycja początkowa (najwyższe wyniki lub wyśrodkowany zawodnik)
  3. liczba wierszy
  4. kolekcja wyników (społecznościowe lub publiczne)
  5. okres (dzienny, tygodniowy, od początku)
  6. wywołanie zwrotne akceptujące obiekt LeaderboardScoreData.

Klasa LeaderboardScoreData jest używana do zwrócenia informacji z powrotem do funkcji wywołujący podczas wczytywania wyników. Członkowie to: 1. ID – identyfikator tabeli wyników 2. Prawidłowy – true, jeśli zwrócone dane są prawidłowe (postępowanie zakończyło się powodzeniem) 3. Stan – ResponseStatus połączenia. 4. Przybliżona liczba – przybliżona liczba wyników w tabeli wyników. 5. Tytuł – tytuł tabeli wyników. 6. PlayerScore – wynik aktualnego gracza; 7. Wyniki - lista wyników 8. PrevPageToken – token służący do wywoływania funkcji LoadMoreScores() w celu wyświetlić poprzednią stronę wyników. 9. NextPageToken – token służący do wywoływania funkcji LoadMoreScores() w celu wyświetlić następną stronę wyników.

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

Połączenie może się nie powieść, gdy spróbujesz załadować znajomych z ResponseCode.ResolutionRequired, jeśli użytkownik nie udostępnił swojej listy znajomych z grą. W takim przypadku użyj polecenia AskForLoadFriendsResolution, aby wysłać prośbę dostęp.

Pobierz nazwy graczy

Każdy wynik zawiera identyfikator użytkownika, który utworzył wynik. Za pomocą Social.LoadUsers(), aby wczytać profil gracza. Pamiętaj, że treść profilu gracza podlegają ustawieniom prywatności graczy.

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