Los tableros de puntos, LeaderBoards, o listas de puntuación estan con nosotros desde siempre. Algunos recordamos esas míticas maquinas recreativas que te permitían poner tres letras en la lista de puntuaciones. Puntuaciones que eran locales, de esa maquina, pero todos los visitantes del salon nos conocíamos, todos sabían a quien pertenecía la combinación de siglas PMM.
Después de este pequeño ataque nostálgico voy a explicar como crear una Tablero de puntos usando Google Play Services para un juego desarrollado en Unity.
Requisitos:
- Aplicación Unity. Faltaría más, sin esto mejor lo dejamos correr.
- Aplicación Unity configurada en la Google Play Console. Si no la tenis podéis pasaros por estos dos posts: Cómo subir un juego Unity a la Google PlayStore y Cómo firmar un apk de UNITY para subirlo a la Google Play Store.
- Game Services configurados: Incorporando Google Logros con Google Play Services para UNITY.
1-Configurando nuestro Leaderboard en Google Play Console.
Vamos a Game Services en el menú de la izquierda y seleccionamos la aplicación a configurar. ¿Que no tenéis una aplicación configurada? Pasaros por el post: Incorporando Google Logros con Google Play Services para UNITY.
Pulsamos ADD LEADERBOARD. Lo que nos va a llevar directamente a la pantalla de configuración de el tablero de puntuaciones.
El tablero de puntuaciones de un juego no es único. Podemos tener tantos como queramos. Imaginemos el tipico juego de carreras, tendriamos un tablero para cada circuito y otro para la temporada general.
Todos los datos a informar son muy simples y autoexplicativos. En el único que pueden haber dudas en en Ordering. Le tenemos que indicar que va primero una puntuación alta o una baja. Siguiendo el ejemplo de un circuito, podríamos tener un tablero de puntuaciones con el tiempo que se tarda en dar la vuelta, esta claro que a un menor tiempo mas alto se tiene que aparecer en la tabla. En este caso tendriamos que escoger la opción SMALLER IS BETTER.
La opción Ordering no se puede modificar una vez creado el LeaderBoard.
Una vez creado el Leaderboard, podemos escoger los recursos y pegarlos en la configuración de Unity, que encontramos en: Window->Google Play Games->Setup->Android Setup.
Todos los recursos que creamos en la Google Play Services, los obtenemos en un xml que debemos pegar en esta ventana de configuración. Con él Unity creará la clase que le indiquemos, en mi caso GPGIdenti con todos los identificadores de los recursos.
2-Los scripts.
No os vais a creer lo sencillo que va a ser esto. Tenemos que hacer dos cosas. Mantener las puntuaciones y mostrar el tablero de puntuaciones cuando lo pida el usuario.
2.1-Enviar puntuaciones al tablero de puntuaciones.
Tenemos que decidir cuando hacerlo. Si se trata de un juego que continuamente estas obteniendo puntos tendremos que encontrar un equilibrio, no podemos estar enviando las puntuaciones de forma casi on-line a Google. Una buena solución podría ser hacerlo al pasar un nivel. En mi caso, he usado un juego en el que la puntuación se actualiza bastante poco, unas dos o tres veces por nivel, así que en cada modificación hago la llamada para actualizar el tablero de puntuaciones.
// public function to add points and update the gui and highscore player prefs accordingly
using GooglePlayGames;
….
public void AddPoints(int amount)
{
// increase score
score+=amount;
// Submit leaderboard scores, if authenticated
#if UNITY_ANDROID
if (PlayGamesPlatform.Instance.localUser.authenticated)
{
// Note: make sure to add ‘using GooglePlayGames’
PlayGamesPlatform.Instance.ReportScore(score,
GPGidenti.leaderboard_giskard_in_the_dark_master_of_universe,
(bool success) =>
{
Debug.Log(“(Giskard) Leaderboard update success: “ + success);
});
}
#endif
// update UI
UIScore.text = “Score: “+score.ToString();
// if score>highscore then update the highscore UI too
if (score>highscore) {
highscore = score;
UIHighScore.text = “Highscore: “+score.ToString();
}
}
Esta es mi función de actualizar los puntos. La llamada para actualizar el contador en Google Play Service esta entre el if del preprocesador que le indica que ese código tan solo tiene que estar disponible para UNITY.
Lo primero es indicar que importamos los Google Play Services: using GooglePlayGames;
Después comprobamos que tenemos sesión abierta con Google Play Services: if (PlayGamesPlatform.Instance.localUser.authenticated)
En el caso de que esté abierta ya podemos hacer la llamada indicando el identificador del leaderboard que queremos actualizar: PlayGamesPlatform.Instance.ReportScore(score, GPGidenti.leaderboard_giskard_in_the_dark_master_of_universe,
(bool success) =>
{
Debug.Log(“(Giskard) Leaderboard update success: “ + success);
});
Como segundo parámetro pasamos una función que será llamada con el resultado de actualizar el leaderboard. En caso de que la actualización haya sido correcta nos devolverá true, y false en caso contrario. Yo solo la uso para trazar el resultado de la operación.
2.2-Mostrar el tablero de puntuaciones.
En el menú principal tengo un botón habilitado que ejecuta una función con este código:
using GooglePlayGames;
using GooglePlayGames.BasicApi;
….
public void ShowLeaderboards()
{
#if UNITY_ANDROID
if (PlayGamesPlatform.Instance.localUser.authenticated)
{
PlayGamesPlatform.Instance.ShowLeaderboardUI();
}
else
{
Debug.Log(“Cannot show leaderboard: not authenticated”);
}
#endif
}
Tenemos los using para incorporar las librerías, el if que nos comprueba si tenemos una sesión abierta con Google Play Services y una línea nueva: PlayGamesPlatform.Instance.ShowLeaderboardUI();
¿Que obtenemos con esta llamada? Pues esta imagen:
Cojonudo! Y con solo una llamada.
Integrar Google Play Services en cualquier juego es muy sencillo. El esfuerzo que representa se ve compensado plenamente por loe beneficios obtenidos.
El leaderboard del juego Giskard in the dark se ha creado siguiendo esta guía. El código utilizado para el post ha salido directamente del juego. No dudes en bajarlo de la Google Play Store para ver el resultado!