Classifiche nei giochi Unity

Questo argomento descrive come utilizzare le classifiche di Play Services per i giochi nei giochi Unity.

Prima di iniziare

Configura il progetto Unity e il plug-in Google Play Giochi per Unity. Per maggiori dettagli, consulta la Guida introduttiva.

Crea eventi

Puoi creare le classifiche in Google Play Console. Per maggiori dettagli, consulta la guida alle classifiche per Play Services. Dopo aver creato una classifica, aggiungi la relativa risorsa Android al plug-in come descritto nella guida introduttiva.

Pubblicare un punteggio in una classifica

Per pubblicare un punteggio in una classifica, chiama 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
    });

Per pubblicare un punteggio e includere un tag dei metadati, utilizza direttamente un'istanza 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
    });

Tieni presente che la piattaforma e il server elimineranno automaticamente i punteggi inferiori al punteggio più alto esistente del giocatore, quindi puoi inviare i punteggi liberamente senza alcun controllo per verificare se il punteggio è superiore o meno al punteggio esistente del giocatore.

Mostrare l'interfaccia utente della classifica

Per mostrare l'interfaccia utente integrata per tutte le classifiche, chiama Social.ShowLeaderboardUI.

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

Se vuoi mostrare una classifica specifica anziché tutte le classifiche, puoi passare un ID classifica al metodo. Tuttavia, si tratta di un'estensione di Google Play Giochi, pertanto l'oggetto Social.Active deve prima essere trasmesso a un oggetto PlayGamesPlatform:

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

Accedere ai dati della classifica

Esistono due metodi per recuperare i dati del punteggio della classifica.

Utilizzare Social.ILeaderboard

Questo metodo utilizza l'interfaccia ILeaderboard per definire l'ambito e i filtri per recuperare i dati. Questo approccio ti consente di configurare: 1. L'ID classifica 2. La raccolta (social o pubblica) 3. L'intervallo di tempo (giornaliero, settimanale, totale) 4. La posizione del ranking da cui iniziare a recuperare i punteggi. 5. Il numero di punteggi (il valore predefinito è 25). 6. Filtra per ID utente.

Se il parametro from non è positivo, i risultati restituiti sono centrati sul giocatore, il che significa che vengono restituiti i punteggi intorno al punteggio del giocatore corrente.

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

Utilizzare PlayGamesPlatform.LoadScores()

Questo metodo utilizza direttamente PlayGamesPlatform, che offre maggiore flessibilità e informazioni quando si accede ai dati della classifica.

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

I parametri di LoadScores() sono:

  1. leaderboardId
  2. posizione iniziale (punti migliori o centrata sul giocatore)
  3. conteggio righe
  4. raccolta della classifica (social o pubblica)
  5. Intervallo di tempo (giornaliero, settimanale, totale)
  6. Un callback che accetta un oggetto LeaderboardScoreData.

La classe LeaderboardScoreData viene utilizzata per restituire le informazioni all'autore della chiamata al caricamento dei punteggi. I membri sono: 1. Id: l'ID classifica 2. Valid: true se i dati restituiti sono validi (la chiamata è andata a buon fine) 3. Stato: lo stato ResponseStatus della chiamata 4. ApproximateCount: il numero approssimativo di punteggi nella classifica 5. Titolo: il titolo della classifica 6. PlayerScore: il punteggio del giocatore corrente 7. Punteggi: l'elenco dei punteggi 8. PrevPageToken: un token che può essere utilizzato per chiamare LoadMoreScores() per recuperare la pagina precedente dei punteggi. 9. NextPageToken: un token che può essere utilizzato per chiamare LoadMoreScores() per recuperare la pagina successiva dei punteggi.

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

Questa chiamata potrebbe non riuscire durante il tentativo di caricare gli amici con ResponseCode.ResolutionRequired se l'utente non ha condiviso il suo elenco di amici con il gioco. In questo caso, utilizza AskForLoadFriendsResolution per richiedere accesso.

Recuperare i nomi dei giocatori

Ogni punteggio contiene l'attributo userId del giocatore che lo ha ottenuto. Puoi usare Social.LoadUsers() per caricare il profilo del giocatore. Ricorda che i contenuti del profilo del giocatore sono soggetti alle impostazioni della privacy del giocatore.

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