Classements dans les jeux Unity

Cet article explique comment utiliser les classements des services de jeux Play dans les jeux Unity.

Avant de commencer

Configurez votre projet Unity et le plug-in Google Play Jeux pour Unity. Pour en savoir plus, consultez le guide de démarrage.

Créer des événements

Vous pouvez créer des classements dans la Google Play Console. Pour en savoir plus, consultez le guide des classements des services de jeux Play. Après avoir créé un classement, ajoutez sa ressource Android au plug-in, comme décrit dans le guide de démarrage.

Publier un score dans un classement

Pour publier un score dans un classement, appelez 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
    });

Pour publier un score et inclure une balise de métadonnées, utilisez directement une instance 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
    });

Notez que la plate-forme et le serveur écartent automatiquement les scores inférieurs au record existant du joueur. Vous pouvez ainsi envoyer des scores librement sans vérifier si le score est supérieur ou non au score existant du joueur.

Afficher l'UI des classements

Pour afficher l'interface utilisateur intégrée de tous les classements, appelez Social.ShowLeaderboardUI.

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

Si vous souhaitez afficher un classement particulier plutôt que tous les classements, vous pouvez transmettre un ID de classement à la méthode. Toutefois, comme il s'agit d'une extension Play Jeux, l'objet Social.Active doit d'abord être converti en objet PlayGamesPlatform :

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

Accéder aux données des classements

Deux méthodes sont disponibles pour récupérer les données des classements.

Utiliser Social.ILeaderboard

Cette méthode utilise l'interface ILeaderboard pour définir la portée et les filtres d'obtention des données. Cette approche vous permet de configurer : 1. L'ID du classement. 2. La collection (sociale ou publique). 3. Le délai (quotidien, hebdomadaire, permanent). 4. La position dans le classement à partir de laquelle les scores doivent commencer à être récupérés. 5. Le nombre de scores (la valeur par défaut est 25). 6. Le filtre par ID utilisateur.

Si le paramètre "from" n'est pas positif, les résultats renvoyés sont centrés sur le joueur, ce qui signifie que les scores proches de celui du joueur actuel sont renvoyés.

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

Utiliser PlayGamesPlatform.LoadScores()

Cette méthode utilise directement PlayGamesPlatform, qui fournit davantage de flexibilité et d'informations lors de l'accès aux données des classements.

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

Les paramètres de LoadScores() sont les suivants :

  1. ID du classement
  2. Position de départ (meilleurs scores ou scores centrés sur le joueur)
  3. Nombre de lignes
  4. Collection de classements (sociaux ou publics)
  5. Délai (quotidien, hebdomadaire, permanent)
  6. Rappel acceptant un objet LeaderboardScoreData

La classe LeaderboardScoreData permet de renvoyer des informations à l'appelant lors du chargement des scores. Les membres sont les suivants : 1. Id : ID du classement. 2. Valid : "true" si les données renvoyées sont valides (l'appel a abouti). 3. Status : état de réponse de l'appel. 4. ApproximateCount : nombre approximatif de scores contenus dans le classement. 5. Title : titre du classement. 6. PlayerScore : score du joueur actif. 7. Scores : liste des scores. 8. PrevPageToken : jeton qui peut être utilisé pour appeler LoadMoreScores() afin d'obtenir la page précédente des scores. 9. NextPageToken : jeton qui peut être utilisé pour appeler LoadMoreScores() afin d'obtenir la page suivante des 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;
            });
    }

Cet appel peut échouer en cas de tentative de chargement des amis avec ResponseCode.ResolutionRequired si l'utilisateur n'a pas partagé sa liste d'amis avec le jeu. Dans ce cas, utilisez AskForLoadFriendsResolution pour demander l'accès.

Obtenir les noms des joueurs

Chaque score contient l'ID utilisateur du joueur qui a réalisé le score. Vous pouvez utiliser Social.LoadUsers() pour charger le profil du joueur. N'oubliez pas que le contenu du profil du joueur est soumis aux paramètres de confidentialité des joueurs.

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