Single Tech Games

Un Flappy Bird con C# en Unity 2D parte 5

Hola Gente! Hoy finalizamos el flappy bird en Unity 2D así como está el original, implementamos sonidos, el inicio, botones al final, y así sustantivamente (como dijo el chavo) no es un vídeo muy largo pero ya esta listo para exportar a Android y sobre todo está listo para la próxima semana ponerle Google Game Services, con lo que quedaría listo para ponerle Admob, que sería, el vídeo que le sigue al de Game Services, como ven hay un par de vídeos por recorrer todavía pero estamos a buen paso 🙂 no como mi juego  ¬¬

Y hablando de mi juego, ya está a puertas, es hoy cuando más los necesito 😛 el primer mes de salido el juego necesita muchas descargas, confió en ustedes ^_^ pronto verán un trailer en el canal y lo podrán bajar por Google Play, tiene 3 semanas de retraso U_U pero sigo con fuerza, esta semana haré una encuesta del icono, sino el más importante punto de marketing del juego, mostraré una serie de opciones y cada uno podrá hacer clic en el que más le guste 🙂 eso lo tomaré muy en cuenta al final cuando este todo listo para subir el juego.
Sonido
Agradecer a NenadSimic por el sonido, lo pueden bajar de Open Game Art en este link
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;
	// 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 && toque.phase != TouchPhase.Canceled)
				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()
	{
		const int anchoBoton = 84;
		const int altoBoton = 60;
		if(juegoTerminado)
		{
			// Dibujamos un boton  de Reinicio
			if (
				GUI.Button(
				new Rect(Screen.width / 2 - (anchoBoton / 2), (1.5f * Screen.height / 3) -
			         (altoBoton / 2), anchoBoton, altoBoton), "Reiniciar!"))
				{
					Application.LoadLevel("escena1");
				}
			if (
				GUI.Button(
				new Rect(
				Screen.width / 2 - (anchoBoton / 2),
				(2 * Screen.height / 3) - (altoBoton / 2),
				anchoBoton,
				altoBoton
				),
				"Puntajes!"
				)
				)
			{
			}
			if (
				GUI.Button(
				new Rect(
				Screen.width / 2 - (anchoBoton / 2),
				(2.5f * Screen.height / 3) - (altoBoton / 2),
				anchoBoton,
				altoBoton
				),
				"Compartir!"
				)
				)
			{
			}
		}
	}
}

TubosScript

using UnityEngine;
using System.Collections;
public class TubosScript : MonoBehaviour {
	//declaramos la velocidad inicial de la columna
	public Vector3 velocidad;
	//La distancia que habra entre una columna y otra
	public Vector3 distanciaEntreColumnas;
	//La forma correcta de hacerlo ¿?
	public SpriteRenderer formaColumna;
	public GUIText puntajes;
	private bool aumentarPuntajes = true;
	public bool juegoIniciado;
	//sonido de cada punto
	public AudioClip sonidoPunto;
	void Update () {
		//funcion que mueve los tubos
		if(juegoIniciado == true)
			moverTubo ();
	}
	private void moverTubo()
	{
		//Los tubos iran avanzando de a pocos, igual que el Flappy bird
		this.transform.position = this.transform.position + (velocidad*Time.deltaTime);
		if (this.transform.position.x <= -13.5f)
		{
			//Le aumentamos la distancia entre columnas al llegar a la posicion -13.5
			Vector3 posicionTemporal = this.transform.position + distanciaEntreColumnas;
			//Cambiamos el lugar en Y por uno random
			posicionTemporal.y = Random.Range (-3f, 0.6f);
			//Movemos a los tubos a esa posicion
			this.transform.position = posicionTemporal;
			aumentarPuntajes = true;
		}
		if (this.transform.position.x <= -12.8f & aumentarPuntajes == true)
		{
			int puntos = int.Parse(puntajes.text) + 1;
			puntajes.text = puntos.ToString();
			aumentarPuntajes = false;
			//llamamos al sonido
			ReproducirSonido(sonidoPunto);
		}
	}
	//Reproduce un efecto de sonido
	private void ReproducirSonido(AudioClip clipOriginal)
	{
		// Como no es un sonido 3D la posicion no importa
		AudioSource.PlayClipAtPoint(clipOriginal, transform.position);
	}
}

Suerte!

0 0 votes
Article Rating
Subscribe
Notify of
guest
16 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
fernando yevenes

por fin llegue ha hacer el tutoria.. ojo amigo hay que diferenciar lo que es una funcion o metodo .. ejemplo en el video dijiste funcion , la relaidad es un metodo
private void ReproducirSonido(AudioClip clipOriginal)
abria sido distinto si fuece
static double CalculateArea(int r)
{
double area = r * r * Math.PI;
return area;
}
la diferencia de metodos y funciones es la accion ejecutar algo inmediato ademas tiene la variable void que significa Vacio a diferencia de una funcion ejectuta algo inmediato dependiendo del codigo interno con la diferencia que nos trae un valor de retorno
el metodo ReproducirSonido “propio” puede reproducir cualque sonido de nuestra libreria o no se carpeta de sonido por ejemplo si agregaramos por cada click un sonido de aleteoo lo buscaria
me llamo la forma de generar botones … imagino que en uno de tus tutoriales hablas de botones y menu para ejecutar ecenas … saludos
eso julio si te puedo ayudar en algo colega =)

manuel alejandro

hola mil gracias por tu blog canal de youtube y comentarios raros y divertidos que dices en tus videos, como harias una barra de vida y mas importante aun que codigo se usa para que despues de la colicion digamos desaparecieran los tubos, que en mi caso los tubos son unas lindas papas fritas
la vida la cree con public int vida y esta se degrada a -1 con cada colicion y para que no se repitiera con cada colicion quitaba el box colider pero despues ya ninguna papa podia tocarlo por lo que solo podia perder un punto de la vida

Ernesto

Quiero poner un boton de pausa pero no se como hacerlo.

Ernesto

Munchas gracias julio, me quede atorado aqui.Suerte.

Ernesto

Oye disculpa, pero podrias subir el proyecto para compararlo con el nuestr para ver que hicimos ma,l por favor porque segun yo lo tengo igual que en los tutoriales y no vuela el pajaro.

juancho

oye como le podria hacer para que cuando muera muestre un cuadro con el record que isiste, y el mayor record?
asi como el flappy bird el primero que salio 🙂

Alfonso

Cuando doy click para que comienze el juego, en vez de comenzar se pone en pausa
hay alguna explicacion para que pase eso?

jano

Existe alguna forma para lograr que, pasando el tiempo, el escenario comience a acelerar?, para hacerlo mas difícil digo yo