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!
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 =)
Gracias por la aclaración. Suerte!
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
Hola! Gracias por las palabras 😀 para lo de las papas, solo colocale this.transform.gameobject.setactive(false) despues de colisionar y con eso desaparece, para lo de los puntos usa: void OnCollisionExit2D(Collision2D col) {
Debug.Log(“quitarpunto”);
}
Esto se ejecuta una sola vez, al momento de terminar la colision, con eso aseguras que sea solo 1 lo que quite, lo de la barra de vida si es un poco mas complicado, lo más facil sería que tengas una imagen de un color y le vayas reduciendo el tamaño con cada colision
Quiero poner un boton de pausa pero no se como hacerlo.
Es un Script bien sencillito, http://answers.unity3d.com/questions/22906/pause-button-script.html practicamente al colocar Time.timeScale = 0.0; haces que el juego tenga una pausa
Munchas gracias julio, me quede atorado aqui.Suerte.
🙂
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.
Lo subí en el video final 🙂
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 🙂
Tendrías que almacenar el mayor record para esto dale una mirada a esto: http://docs.unity3d.com/ScriptReference/PlayerPrefs.html y luego ir mostrandola cada vez que mueres
Cuando doy click para que comienze el juego, en vez de comenzar se pone en pausa
hay alguna explicacion para que pase eso?
No recuerdo haber implementado un boton de pausa en el juego o.O! la verdad no tengo ni idea de por que, sry
Existe alguna forma para lograr que, pasando el tiempo, el escenario comience a acelerar?, para hacerlo mas difícil digo yo
Cuentas el tiempo con Time.DeltaTime y cuando llegue aun punto le agregas velocidad a los tubos o escenario