Tablas de clasificación en juegos de Unity

En este tema, se describe cómo usar las tablas de clasificación de los Servicios de Play Games en los juegos de Unity.

Antes de comenzar

Configura tu proyecto de Unity y el complemento de Google Play Games para Unity. Si deseas obtener más detalles, consulta la guía de introducción.

Crea eventos

Las tablas de clasificación se crean en Google Play Console. Para obtener más detalles, consulta la guía de tablas de clasificación para los Servicios de Play Games. Después de crear una tabla de clasificación, agrega su recurso de Android al complemento, como se describe en la guía de introducción.

Publica puntuaciones en una tabla de clasificación

Para publicar puntuaciones en una tabla de clasificación, llama a 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
    });

Para publicar una puntuación e incluir una etiqueta de metadatos, usa directamente una instancia de 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
    });

Ten en cuenta que la plataforma y el servidor descartarán de forma automática las puntuaciones inferiores a la puntuación alta actual del jugador, de manera que puedes enviar las puntuaciones con libertad sin necesidad de verificar si son mayores que la puntuación actual del jugador.

Muestra la IU de la tabla de clasificación

Para mostrar la IU integrada de todas las tablas de clasificación, llama a Social.ShowLeaderboardUI.

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

Si deseas mostrar una tabla de clasificación específica en lugar de todas, puedes pasar al método un ID de tabla de clasificación. Sin embargo, esta es una extensión de Play Games, por lo que primero se debe convertir el objeto Social.Active a un objeto PlayGamesPlatform:

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

Accede a los datos de la tabla de clasificación

Existen 2 métodos para recuperar los datos de puntuación de la tabla de clasificación.

Usa Social.ILeaderboard

Este método usa la interfaz de ILeaderboard para definir el alcance y los filtros para obtener los datos. Este enfoque te permite configurar lo siguiente: 1. El ID de la tabla de clasificación 2. La colección (social o pública) 3. El período (diario, semanal o permanente) 4. La posición de la clasificación para comenzar a recuperar puntuaciones 5. La cantidad de puntuaciones (la configuración predeterminada es 25) 6. El filtro por ID del usuario

Si el parámetro from no es positivo, los resultados devueltos se centran en el jugador, lo que significa que se devuelven las puntuaciones cercanas a la puntuación del jugador actual.

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

Usa PlayGamesPlatform.LoadScores()

Este método usa PlayGamesPlatform directamente, lo que proporciona mayor flexibilidad y más información al acceder a los datos de la tabla de clasificación.

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

Los parámetros para LoadScores() son los siguientes:

  1. el ID de la tabla de clasificación
  2. la posición inicial (puntuaciones superiores o centradas en el jugador)
  3. la cantidad de filas
  4. la colección de la tabla de clasificación (social o pública)
  5. el período (diario, semanal o permanente)
  6. la devolución de llamada que acepta un objeto LeaderboardScoreData

La clase LeaderboardScoreData se usa para devolverle información al llamador cuando se cargan las puntuaciones. Los miembros son los siguientes:

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

Esta llamada puede fallar cuando se intenta cargar amigos con ResponseCode.ResolutionRequired si el usuario no compartió su lista de amigos con el juego. En este caso, usa AskForLoadFriendsResolution para solicitar acceso.

Obtén los nombres de los jugadores

Cada puntuación tiene el ID de usuario del jugador que hizo la puntuación. Puedes usar Social.LoadUsers() para cargar el perfil del jugador. Recuerda que el contenido del perfil del jugador está sujeto a la configuración de privacidad de los jugadores.

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