Tabele wyników w grach na Unity

W tym artykule opisano, jak korzystać z tablic wyników usług gier Play w grach w Unity.

Zanim rozpoczniesz

Skonfiguruj projekt Unity i wtyczkę Google Play Games do Unity. Więcej informacji znajdziesz w Przewodniku dla początkujących.

Tworzenie wydarzeń

Tabele wyników tworzysz w Konsoli Google Play. Szczegółowe informacje znajdziesz w przewodniku po tabelach liderów w Usługach Google Play Games. Po utworzeniu tablicy wyników dodaj jej zasób na Androida do wtyczki zgodnie z instrukcjami podanymi w przewodniku po rozpoczęciu.

Publikowanie wyniku w tabeli wyników

Aby opublikować wynik na tablicy wyników, wywołaj funkcję 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 dołączyć 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 najlepszy wynik gracza, więc możesz przesyłać wyniki bez żadnych kontroli, aby sprawdzić, czy są one wyższe niż dotychczasowy wynik gracza.

Wyświetlanie interfejsu tablicy wyników

Aby wyświetlić wbudowany interfejs wszystkich tabel wyników, wywołaj funkcję Social.ShowLeaderboardUI.

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

Jeśli chcesz wyświetlić konkretną tabelę wyników zamiast wszystkich, możesz przekazać do metody identyfikator tabeli wyników. Jest to jednak rozszerzenie w Google Play Games, więc obiekt Social.Active musi najpierw zostać rzutowany na obiekt PlayGamesPlatform:

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

Dostęp do danych tabeli wyników

Dane o punktacji na tablicy wyników można pobrać na 2 sposoby.

Korzystanie z tabeli wyników Social.I

Ta metoda używa interfejsu ILeaderboard do definiowania zakresu i filtrów służących do pobierania danych. Dzięki temu możesz skonfigurować: 1. Identyfikator tabeli wyników.2. kolekcja (społeczna lub publiczna); Przedział czasowy (codziennie, co tydzień, cały czas)4. Pozycja w rankingu, od której mają być pobierane wyniki. 5. Liczba ocen (wartość domyślna to 25). 6. Filtrowanie według identyfikatora użytkownika.

Jeśli parametr from nie jest dodatni, zwracane wyniki są oparte na graczu, 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żywanie funkcji PlayGamesPlatform.LoadScores()

Ta metoda używa bezpośrednio funkcji PlayGamesPlatform, co zapewnia dodatkową elastyczność i więcej informacji podczas uzyskiwania dostępu do danych z tablicy lideró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 funkcji LoadScores() to:

  1. leaderboardId
  2. pozycja początkowa (najlepsze wyniki lub ukierunkowana na gracza);
  3. liczba wierszy
  4. kolekcja tabel wyników (społeczna lub publiczna);
  5. zakres czasowy (codziennie, co tydzień, wszystkie czasy)
  6. wywołanie zwrotne przyjmujące obiekt LeaderboardScoreData.

Klasa LeaderboardScoreData służy do zwracania informacji do wywołującego podczas wczytywania wyników. Członkowie:1. Id – identyfikator tabeli wyników. Valid (prawidłowy) – wartość true (prawda), jeśli zwrócone dane są prawidłowe (czyli wywołanie zakończyło się powodzeniem). 3. Status – stan odpowiedzi wywołania. 4. ApproximateCount – przybliżona liczba wyników w tabeli. 5. Tytuł – tytuł tabeli liderów. 6. PlayerScore – wynik bieżącego gracza. 7. Wyniki – lista wyników. PrevPageToken – token, który można użyć do wywołania funkcji LoadMoreScores() w celu uzyskania poprzedniej strony wyników. 9. NextPageToken – token, którego można użyć do wywołania LoadMoreScores() w celu uzyskania kolejnej strony 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;
            });
    }

Ten wywołanie może się nie udać, gdy próbujesz wczytać listę znajomych za pomocą funkcji ResponseCode.ResolutionRequired, jeśli użytkownik nie udostępnił listy znajomych grze. W takim przypadku użyj AskForLoadFriendsResolution, aby poprosić o dostęp.

Pobieranie nazw graczy

Każdy wynik zawiera identyfikator użytkownika, który go uzyskał. Aby załadować profil gracza, możesz użyć opcji Social.LoadUsers(). Pamiętaj, że zawartość profilu gracza podlega ustawieniom prywatności gracza.

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