Tabele wyników w grach na Unity

W tym artykule opisujemy, jak korzystać z tablic wyników w usługach gier Play w grach na platformę 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 tworzy się w Konsoli Google Play. Szczegółowe informacje znajdziesz w przewodniku po tablicach wyników w usługach gier Play. Po utworzeniu tablicy wyników dodaj do wtyczki jej zasób Androida zgodnie z opisem w przewodniku dla początkujących.

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 uwzględnić 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 od dotychczasowego wyniku 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 Usług gier Play, więc obiekt Social.Active musi zostać najpierw przekształcony w obiekt PlayGamesPlatform:

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

Dostęp do danych z tabeli wyników

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

Używanie Social.ILeaderboard

Ta metoda używa interfejsu ILeaderboard do określania zakresu i filtrów do pobierania danych. Ta metoda umożliwia skonfigurowanie:1. Identyfikator tabeli wyników 2. kolekcja (społeczna lub publiczna); 3. Przedział czasowy (dzienny, tygodniowy, od początku) 4. Pozycja w rankingu, od której mają być pobierane wyniki. 5. Liczba wyników (domyślnie 25). 6. Filtruj według identyfikatora użytkownika.

Jeśli parametr from jest nieujemny, zwracane wyniki są skoncentrowane 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 korzysta bezpośrednio z PlayGamesPlatform, co zapewnia większą elastyczność i więcej informacji podczas uzyskiwania dostępu do danych tablicy 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 funkcji LoadScores() to:

  1. leaderboardId
  2. pozycja początkowa (najlepsze wyniki lub widok na gracza);
  3. liczba wierszy,
  4. kolekcja tablic wyników (społeczna lub publiczna),
  5. okres (dzienny, tygodniowy, od początku)
  6. wywołanie zwrotne akceptujące obiekt LeaderboardScoreData.

Klasa LeaderboardScoreData służy do zwracania informacji do wywołującego podczas wczytywania wyników. Członkowie to:

1. Id - the leaderboard id
2. Valid - true if the returned data is valid (the call was successful)
3. Status - the ResponseStatus of the call
4. ApproximateCount - the approximate number of scores in the leaderboard
5. Title - the title of the leaderboard
6. PlayerScore - the score of the current player
7. Scores - the list of scores
8. PrevPageToken - a token that can be used to call `LoadMoreScores()` to
    get the previous page of scores.
9. NextPageToken - a token that can be used to call `LoadMoreScores()` to
    get the next page of scores.
    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 powieść podczas próby wczytania znajomych z ResponseCode.ResolutionRequired, jeśli użytkownik nie udostępnił swojej listy znajomych w grze. W takim przypadku użyj AskForLoadFriendsResolution, aby poprosić o dostęp.

Pobieranie nazw graczy

Każdy wynik zawiera identyfikator użytkownika gracza, który go uzyskał. Aby wczytać profil gracza, możesz użyć Social.LoadUsers(). Pamiętaj, że zawartość profilu gracza podlega 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);
            });
    }