Tabele wyników w grach na Unity

Z tego artykułu dowiesz się, jak korzystać z tabel wyników w usługach gier Play w grach na Unity.

Zanim rozpoczniesz

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

Tworzenie wydarzeń

Tabele wyników tworzy się w Konsoli Google Play. Szczegółowe informacje znajdziesz w przewodniku po tabelach wyników w przypadku usług gier Play. Po utworzeniu tabeli wyników dodaj do wtyczki jej zasób Androida zgodnie z opisem w przewodniku 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 umieścić tag metadanych, użyj bezpośrednio instancji 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
    });

Pamiętaj, że platforma i serwer automatycznie odrzucają wyniki niższe niż dotychczasowy rekord gracza, więc możesz swobodnie przesyłać wyniki bez sprawdzania, czy wynik jest wyższy niż istniejący wynik gracza.

Pokaż interfejs tabeli wyników

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

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

Jeśli chcesz wyświetlać konkretną tabelę wyników zamiast wszystkich, możesz przekazać do metody identyfikator tabeli wyników. To jednak rozszerzenie Gier Play, więc obiekt Social.Active trzeba najpierw rzutować na obiekt PlayGamesPlatform:

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

Dostęp do danych z tabeli wyników

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

Używaj tabeli Social.Idl

Ta metoda korzysta z interfejsu tabeli wyników do definiowania zakresu i filtrów pobieranych danych. W ten sposób możesz skonfigurować: 1. Identyfikator tabeli wyników. 2. kolekcja (społecznościowa lub publiczna). 3. Okres (codziennie, co tydzień, cały okres) 4. Pozycja w rankingu, na której możesz rozpocząć pobieranie wyników. 5. Liczba wyników (domyślnie jest to 25). 6. Filtruj według identyfikatora użytkownika.

Jeśli parametr from nie jest dodatni, zwracane wyniki są wyśrodkowane na gracza, co oznacza, że zwracane są wyniki wokół wyniku bieżącego gracza.

    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 wykorzystuje bezpośrednio atrybut PlayGamesPlatform, co zapewnia dodatkową elastyczność i dodatkowe informacje podczas uzyskiwania dostępu do danych tabeli 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():

  1. Identyfikator tablicy wyników
  2. pozycja początkowa (najwyższe wyniki lub wyśrodkowanie gracza)
  3. liczba wierszy
  4. tabela wyników (społecznościowe lub publiczne)
  5. okres (dzienny, tygodniowy, cały okres)
  6. wywołania zwrotnego, które akceptuje obiekt LeaderboardScoreData.

Klasa LeaderboardScoreData służy do zwracania informacji z powrotem do wywołującego podczas wczytywania wyników. Członkowie są: 1. Id – identyfikator tabeli wyników; 2. Prawidłowy – „prawda”, jeśli zwrócone dane są prawidłowe (wywołanie 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(), by wyświetlić poprzednią stronę z wynikami. 9. NextPageToken – token, który umożliwia wywołanie LoadMoreScores() w celu wyświetlenia następnej strony z wynikami.

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

To wywołanie może się nie udać podczas próby wczytania listy znajomych użytkownika ResponseCode.ResolutionRequired, jeśli użytkownik nie udostępnił w grze swojej listy znajomych. W takim przypadku, aby poprosić o dostęp, użyj AskForLoadFriendsResolution.

Pobierz nazwy graczy

Każdy wynik ma identyfikator userId gracza, który utworzył wynik. Do wczytania profilu gracza możesz użyć Social.LoadUsers(). Pamiętaj, że zawartość profilu gracza zależy od jego ustawień prywatności.

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