Single Tech Games

Unity 2D y Google Game Services, Flappy Bird parte 6

Hola Gente! Hoy les traigo un pequeño gran tutorial que me pidieron desde que comenzó el año prácticamente 😛 como usar Google Play Game Services en Unity 2D y bueno para esto seguimos utilizando el Flappy Bird que estuvimos creando hasta ahora.

La ventaja de Google Play Game services en verdad es los extras que le puede brindar a cualquier juego, los logros, el poder compartirlos, los puntajes más altos, etc. además viene con opciones para multiplayer y grabar el juego en la nube y poder compartirlo a través de Google Play en otros dispositivos, algo bastante interesante que el mismo Unity quiere emular con su Cloud, pero eso es tema de otros tutoriales, por lo pronto veremos un caso pequeño de como usar Google Play Game services en nuestro juego y poder hacer uso de ello para brindar una mejor experiencia al usuario.
El plugin de Google Game Play Services para Unity lo pueden encontrar aquí
Si no saben como compilar en Android o no tienen el SDK instalado en Unity por favor revisar este video
PD-> Cuidado con Rodinia Games que son unos estafadores, me han contado que ofrecen muchos euros por hacer sus juegos y al final no pagan. Mucho cuidado con ellos
PD 2-> Si quieren que se mantenga logueado durante todo el tiempo coloquen esta función en la clase ServiciosGoogleScript

void Awake () {
		DontDestroyOnLoad (transform.gameObject);
	}

Código
FlappyScript

using UnityEngine;
using System.Collections;
public class flappyScript : MonoBehaviour {
	//Declaramos la velocidad inicial del pajaro sea igual a zero, Vector3.zero = 0,0,0
	//1,1,0
	Vector3 velocidad = Vector3.zero;
	//Declaramos un vector que controle la gravedad, no usaremos la fisica de unity
	public Vector3 gravedad;
	//Declaramos un vector que define el salto (aleteo) del pajaro
	public Vector3 velocidadAleteo;
	//Declaramos si se debe aletear, si se toco la pantalla o se presiono espacio
	bool aleteo = false;
	//Declaramos la velocidad maxima de rotacion del pajaro
	public float velocidadMaxima;
	public TubosScript tubo1;
	public TubosScript tubo2;
	private Animator anim;
	private bool juegoTerminado;
	private bool juegoIniciado;
	//Declaramos el objeto que tiene el script de Google Play Game Services
	public ServiciosGoogleScript servicios;
	// Use this for initialization
	void Start () {
		anim = this.gameObject.GetComponent<Animator> ();
	}
	// Update is called once per frame
	void Update (){
		//aumenta con el numero de presiones en la pantalla
		int numPresiones = 0;
		foreach (Touch toque in Input.touches) {
			if (toque.phase == TouchPhase.Ended)
				numPresiones++;
		}
		//Si la persona presiona el boton de espacio o hace clic en la pantalla con el mouse, o tocas con el dedo
		if (Input.GetKeyDown(KeyCode.Space) | Input.GetMouseButtonDown(0) | numPresiones > 0) {
			if(juegoTerminado == false)
				aleteo = true;
			juegoIniciado = true;
			tubo1.juegoIniciado = true;
			tubo2.juegoIniciado = true;
		}
	}
	//Este es el update de la fisica, que es ligeramente mas lento que el update del juego
	void FixedUpdate () {
		if(juegoIniciado)
		{
			//A la velocidad le sumamos la gravedad (Para que el pajaro caiga)
			velocidad += gravedad * Time.deltaTime;
			//Si presionaron espacio o hicieron clic
			if (aleteo == true)
			{
				//Que solo sea una vez
				aleteo = false;
				//El vector velocidad recibe el impulso hacia arriba al pajaro
				velocidad.y = velocidadAleteo.y;
			}
			//Hacemos que el pajaro reciba la velocidad (la gravedad lo hace caer mas rapido)
			transform.position += velocidad * Time.deltaTime;
			float angulo = 0;
			if (velocidad.y >= 0) {
				//Cambiamos el angulo si Y es positivo que mire arriba
				angulo = Mathf.Lerp (0, 25, velocidad.y/velocidadMaxima);
			}
			else {
				//Cambiamos el angulo si Y es negativo que mire abajo
				angulo = Mathf.Lerp (0, -75, -velocidad.y/velocidadMaxima);
			}
			//Rotamos
			transform.rotation = Quaternion.Euler (0, 0, angulo);
		}
	}
	//Cada vez que haya una colision con cualquier objeto que tenga un collider se actiavara esta funcion
	//Collider son Box Collider 2D, Circle Collider 2D, etc.
	void OnCollisionEnter2D (Collision2D colision)
	{
		//Si colisionamos con el tubo, que se detengan los tubos
		if(colision.gameObject.name == "TuboAbajo" | colision.gameObject.name == "TuboArriba"|colision.gameObject.name == "Piso")
		{
			//Hacemos que la velocidad de los tubos se haga cero
			tubo1.velocidad = new Vector3(0,0,0);
			tubo2.velocidad = new Vector3(0,0,0);
			anim.SetTrigger("JuegoTerminado");
			juegoTerminado = true;
		}
		if(colision.gameObject.name == "Piso")
		{
			gravedad = new Vector3(0,0,0);
		}
		if(colision.gameObject.name == "TuboAbajo")
		{
			colision.gameObject.GetComponent<BoxCollider2D>().enabled = false;
		}
	}
	void OnGUI()
	{
		GUIStyle customButton = new GUIStyle("button");
		customButton.fontSize = 20;
		int anchoBoton = Screen.width / 3;
		int altoBoton = Screen.height / 7;
		if(juegoTerminado)
		{
			// Dibujamos un boton  de Reinicio
			if (
				GUI.Button(
				new Rect(
				Screen.width / 2 - (anchoBoton / 2),
				(1 * Screen.height / 3) - (altoBoton / 2),
				anchoBoton,
				altoBoton
				),
				"Reiniciar!",customButton
				)
				)
			{
				Application.LoadLevel("escena1");
			}
			if (
				GUI.Button(
				new Rect(
				Screen.width / 2 - (anchoBoton / 2),
				(1.5f * Screen.height / 3) - (altoBoton / 2),
				anchoBoton,
				altoBoton
				),
				"Login!",customButton
				)
				)
			{
				//Nos logueamos a google game services
				servicios.Autenticar();
			}
			if (
				GUI.Button(
				new Rect(
				Screen.width / 2 - (anchoBoton / 2),
				(2 * Screen.height / 3) - (altoBoton / 2),
				anchoBoton,
				altoBoton
				),
				"Puntajes!",customButton
				)
				)
			{
				//Ingresamos puntajes
				servicios.Puntajes(int.Parse(tubo1.puntajes.text));
			}
			if (
				GUI.Button(
				new Rect(
				Screen.width / 2 - (anchoBoton / 2),
				(2.5f * Screen.height / 3) - (altoBoton / 2),
				anchoBoton,
				altoBoton
				),
				"Logro!",customButton
				)
				)
			{
				//Ingresamos un logro
				servicios.Logros(5);
			}
		}
	}
}

ServiciosGoogleScript

using UnityEngine;
using System.Collections;
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
//Calse para manipular los Google Play Game Services en Unity
public class ServiciosGoogleScript : MonoBehaviour {
	//leaderboard strings
	private string idPuntajes = "idPuntajes";
	private string idLogro = "idLogro";
	private string idIncremental = "idIncremental";
	// Use this for initialization
	void Start()
	{
		PlayGamesPlatform.Activate();
	}
	//Retorna si esta autenticado o no
	public bool Autenticado()
	{
		if (Social.localUser.authenticated)
			return true;
		else
			return false;
	}
	//Autentica la usuario
	public bool Autenticar()
	{
		bool exito = false;
		Social.localUser.Authenticate((bool success) =>
		                              {
			if (success)
			{
				exito = true;
			}
			else
			{
				exito = false;
			}
		});
		return exito;
	}
	//Se agrega los puntajes al leaderboard
	public bool Puntajes(long puntaje )
	{
		bool exito = false;
		if (Social.localUser.authenticated)
		{
			Social.ReportScore(puntaje, idPuntajes, (bool success) =>
			                   {
				if (success)
				{
					((PlayGamesPlatform)Social.Active).ShowLeaderboardUI(idPuntajes);
					exito = true;
				}
				else
				{
					exito = false;
				}
			});
		}
		return exito;
	}
	//Se agregan los logros
	public bool Logros(long valor )
	{
		bool exito = false;
		if (Social.localUser.authenticated)
		{
			Social.ReportProgress(idLogro, valor, (bool success) =>
			                      {
				if (success)
				{
					exito = true;
				}
				else
				{
					exito = false;
				}
			});
		}
		return exito;
	}
	//Se va incrementado los logros
	public bool LogroIncremental(int valor )
	{
		bool exito = false;
		if (Social.localUser.authenticated)
		{
			((PlayGamesPlatform)Social.Active).IncrementAchievement(idIncremental, valor, (bool success) =>
			                                                        {
				if (success)
				{
					exito = true;
				}
				else
				{
					exito = false;
				}
			});
		}
		return exito;
	}
	//Muestra la tabla de puntajes
	public void mostrarPuntajes()
	{
		((PlayGamesPlatform)Social.Active).ShowLeaderboardUI(idPuntajes);
	}
}

Algunos errores comunes al momento de compilar con Unity 3D y Android.
Si les aparece  Error building Player: Win32Exception: ApplicationName=C:/Users/user/AppData/Local/Android/android-sdk/platforms/(version)\aapt.exe busquen el archivo aapt.exe en sdk\build-tools\xx.x.x.x(versión que les tira el error) una vez hecho esto peguenlo en sdk\platforms\xx.x.x.x(versión que les tira el error) esto y un poco de suerte, les resolverá el error
Si les aparece Error building Player: Win32Exception: ApplicationName=C:/Users/user/Desktop/adt-bundle-windows-x86_64-20140624/sdk\tools\zipalign.exe busquen el archivo zipalign.exe en sdk\build-tools\(version) búsquenlo en todas las carpetas si no lo encuentran al inicio, luego peguenlo en la carpeta sdk\tools
Si les aparece Error building Player: Win32Exception: ApplicationName=’java.exe’, CommandLine=’-Dcom.android.sdkmanager.toolsdir=C:/Program Files (x86)/Android/android-sdk\tools Se puede resolver de 2 maneras, una es instalando el java x86 o de 32 bits, y la otra es copiando el archivo java.exe. de of c:\windows\system32 a c:\windows\syswow64
Si les aparece Exception: Error building Player: Win32Exception: ApplicationName=’C:/Program Files (x86)/Android/android-sdktoolsapkbuilder.bat significa que tienen una version antigua de unity, y actualizaron el sdk, siendo incompatible con el viejo unity, o actualizan unity o le bajan la versión de Android
No se olviden que si quieren modificar la ruta del sdk de Android, pueden ir a Edit>>Preferences>>External Tools y hacerlo:
external tool unitySuerte!

0 0 votes
Article Rating
Subscribe
Notify of
guest
35 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
Daniel

Hola de nuevo Julio!
Llevo varios dias tratando de meter en mi proyecto Unity Google plays junto al sdk de Appodeal (Si lo llevo usando unas semanas tal y como me recomendaste).
El caso es que al combinar los SDK me da error, me imagino que tu has tenido de lidiar con este problema, cual a sido tu solución? gracias!

Daniel

Hola de nuevo^^
Tengo problemas para instalar el service de Google igual que otros compañeros.
Me sale el error “con otra ruta”:
Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details.
C:\Users\Elias\AppData\Local\Android\android-sdk\build-tools\21.1.2\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “C:/Users/Elias/AppData/Local/Android/android-sdk/platforms/android-21\android.jar” -F bin/resources.ap_ –extra-packages
Seguí tu video:
https://www.youtube.com/watch?v=sb87j3JYA2A
Pero creo que se a quedado obsoleto ya que Android support librarys no aparece y en la carpeta Extras no aparece la carpeta libproject.
Tanto cambia el proceso a las diferentes versiones? porque vaya un trabajo!
Te agradecería que lo explicaras de nuevo. Aunque me ha llegado a los oídos que en un mes cambian. Hay una actualziación y todos los servicios de publicidad que hay en las aplicaciones se tienen que actualizar…así que mejor ya nos esperamos 😀 jajaj

Ricardo Lopez

hola, con otra duda, ya esta compilando el proyecto pero me sale este error, te anexo la imagen, espero me puedas orientar, gracias.
http://www.subirimagenes.com/imagen-capturadepantalla-9620524.html

Ricardo Lopez

Hola, ya ejecute el paquete de Gogle Play Services y se guardo en mi proyecto pero cuando me voy a Build no me aparece que pueda compilar para android te anexo la imagen, espero me puedas ayudar, garcias.
http://www.subirimagenes.com/imagen-capturadepantalla-9619791.html

Ricardo Lopez

Hola disculpa la molestia, pase el paquete a unity de Gogle Play Services pero cuando me voya Build no me aparece la opcion para compilar te anexo la imagen para que lo puedas ver, espero me puedas ayudar, muchas gracias http://www.subirimagenes.com/imagen-capturadepantalla-9619791.html

muchas gracias me salvaste casi tiro la toalla enserio gracias. tengo unas pregentas ¿con que windows es mejor trabajar el 7 o el 10? y ¿con que versiones de unity,tools,jdk,api,Plugins PlayGames y MobileAds trabajas actualmente? para cambiarme a esas verciones para no tener mas errores despues y si puedes por fabor pasame los links de descargar te lo agradeceria mucho

Hola Julio Cesar gracias por tus videos fueron de gran ayuda es facil de en tender lo que esplicas quisiera que me ayudes con dos errores que me salen y no los puedo solusionar
el primero es:
CommandInvokationFailure: Failed to re-package resources. See the Console for details.
C:\Users\jkarlos\AppData\Local\Android\sdk\build-tools\24.0.0\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “C:/Users/jkarlos/AppData/Local/Android/sdk\platforms\android-24\android.jar” -F bin/resources.ap_ –extra-packages com.google.example.games.mainlibproj
el segundo es:
Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details.
C:\Users\jkarlos\AppData\Local\Android\sdk\build-tools\24.0.0\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “C:/Users/jkarlos/AppData/Local/Android/sdk\platforms\android-24\android.jar” -F bin/resources.ap_ –extra-packages com.google.example.games.mainlibproj

Elne

Assets/GooglePlayGames/ISocialPlatform/PlayGamesUserProfile.cs(148,36): error CS0117: `UnityEngine.Texture2D’ does not contain a definition for `blackTexture’
Como lo soluciono?

Elias

Si, pero no incluye ese tipo de error, he probado todo lo que hay por la red sin resultado 🙁

Elias

Buenas, antes de nada darte las gracias por tanta dedicación, quería pedirte ayuda con este error, ya que he buscado por mil foros sin hayar solución, en principio pienso que será algún paquete extra que deba copiar de algún lado a otro. El error es este:
Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details.
C:\Users\Elias\AppData\Local\Android\android-sdk\build-tools\21.1.2\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “C:/Users/Elias/AppData/Local/Android/android-sdk/platforms/android-21\android.jar” -F bin/resources.ap_ –extra-packages
stderr[
ERROR: No argument supplied for ‘–extra-packages’ option
Android Asset Packaging Tool
.
.
.

tino

solucionado me faltaba vincular la apk 🙂

tino

failed to sign in. please check your network connection and try again nose que pasa jaja

tino

Solucionado tenia el jdk instalado en Archivos de Programa en vede en Program Files(x86) tan solo tuve que copiar el jdk de una carpeta a otra ;D

tino

Hola ante todo muchas gracias por tu rapida respuesta XD El problema solo me pasa cuando meto el pluguin de google service sin embargo cuando pongo el de admob me deja copilar sin problemas pero tengo que quitar el de service y ya habia bajado todos los productos de oracle ya que al principio empeze programando en eclipse y ya tengo algun juego acabado pero cuando actualize el sdk de android empezo a darme problemas a la hora de copilar voy actualizar el JDK y JRE de Java a ver si se soluciona mi problema y te comento.

tino

y esto como lo soluciono ?¿?¿?¿

tino

Error building Player: Win32Exception: ApplicationName=’C:\Program Files (x86)\Java\jre6\bin\javac.exe’, CommandLine=’-bootclasspath “C:/Users/PC/AppData/Local/Android/android-sdk/platforms/android-20\android.jar” -d “C:\Users\PC\Documents\Unity Project\FPS\Temp\StagingArea\bin\classes” -source 1.6 -target 1.6 -encoding UTF-8 “com\AsturGameSl\SGC\R.java” “com\google\example\games\basegameutils\R.java”‘, CurrentDirectory=’C:\Users\Robert\Documents\Unity Project\FPS\Temp\StagingArea\gen’

Cristian

ignora el comentario anterior, ya lo resolvi 🙂 me hacia fata una linea de codigo xD

Cristian

julio estaba siguiendo tu turorial cuando me encontraba editando el scrip para mi juego, al momento escribir la linea para activar la plataforma PlayGamesPlatform.Activate(); esta linea me dice que no esta dentro del contexto a pesar de que agregue el plugin a unity e hice todos los pasos de tu tutorial :s no se si hice algo mal

Agustin

Exelente Julio, el proximo video sera el de admob?