Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.
Historia de Flappy Bird
¿Conoces el mítico juego del Flappy Bird?. Fue un juego hecho para dispositivos móviles creado en 2013 por el desarrollador vietnamita Dong Nguyen. El juego se volvió extremadamente popular en 2014, y llegó a tener más de 50 millones de descargas. Ese mismo año, su programador decidió retirarlo del mercado alegando que el juego había adquirido «demasiada atención». No obstante, a día de hoy existe infinidad de clónicos. Nosotros vamos a desarrollar nuestra propia versión del Flappy Bird.
A continuación tienes los pasos que irémos dando.
Ponemos el fondo de pantalla
El primer paso de este y otros muchos juegos será poner una imagen de fndo en pantalla. En el juego que nos ocupa será la imagen del espacio, por el que irá flotando nuestro protagonista.
Un misil cae por gravedad
- Añadimos el sprite de un misil a la pantalla.
- Le añadimos al misil un componente de tipo RigidBody 2D.
Tipos de RigidBody
- Dynamic: El cuerpo es afectado por las fuerzas que interactúan con él.
- Kinematic: El cuerpo no es afectado por las fuerzas que interactúan con él.
- Static: Ideal para plataformas estáticas.
Detectamos la pulsación sobre el misil
Recuerda como lo hiciste en el juego de Elige tu propia aventura:
using UnityEngine;
public class Nave : MonoBehaviour
{
void OnMouseDown()
{
Debug.Log("Nave pulsada");
}
}
Animación de explotar
Por defecto Unity reproduce las animaciones en bucle. Para evitar esto, selecciono la animación creada en el panel de proyecto y desmarco la check Loop Time.
Panel Animator
Este panel gestiona la vinculación entre las animaciones y los objetos.
Si un objeto tiene errores en su panel animator, no se reproducirán las animaciones asociadas a él.
Es posible unir las animaciones vinculadas a un objeto mediante flechas. A estas uniones las llamaremos transiciones.
Estado Entry
- Entry es el punto de partida de la animación.
- En muchos casos, el estado Entry va vinculado a un estado creado por nosotros llamado idle, que corresponde a una animación del objeto en reposo.
- Obligatoriamente, el estado Entry debe estar unido con algún otro estado.
- Cuando una animación llega al exit, regresa al estado Entry.
Detonar la animación mediante código:
GetComponent<Animator>().Play("Explosion");

Detener la caída por gravedad del objeto
GetComponent<Rigidbody2D>().simulated = false;
Destruir objeto cuando la animación ha terminado
print( GetComponent<Animator>().runtimeAnimatorController.animationClips[0].name);
float explosionTime = GetComponent<Animator>().runtimeAnimatorController.animationClips[0].length;
Destroy(gameObject, explosionTime );
Instanciar un misil en una posición horizontal aleatoria
float pos = Random.Range(Camera.main.ScreenToWorldPoint(Vector2.zero).x, Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, 0)).x);
GameObject nuevoMisil = Instantiate(misil, new Vector2(pos, Camera.main.ScreenToWorldPoint(new Vector2(0, Screen.height)).y), Quaternion.identity);
Generar un misil cada segundo
Usaremos una corrutina para ello. Dentro de la corrutina iremos instanciando los misiles.
Detectar colisiones
El jugador perderá cuando un misil desaparezca por la parte inferior de la pantalla.
Para detectar esto:
- Ponemos un cubo en la parte inferior de la pantalla y lo estiramos para que ocupe toda su longitud.
- Asignamos Box Collider 2D al cubo, en lugar del Box Collider que tenía. Para detectar la colisión entre dos entidades, estas deben tener el mismo tipo de Box Collider.
- En el componente Box Collider 2D del GameObject AreaInferior, activamos la check isTrigger.
- Vinculamos el siguiente Script al cubo inferior

public class LoserArea: MonoBehaviour{
void OnTriggerEnter2D(Collider2D col){
print("colision");
}
}
Perder vidas
Cada vez que se produzca la colisión anterior, el usuario perderá una vida.
public class LoserArea: MonoBehaviour{
int marker = 3;
public Sprite blackHeart;
void OnCollisionEnter2D(Collision2D col){
marker--;
if(marker == 2){
GameObject.Find("Live3").GetComponent<SpriteRenderer>().sprite = blackHeart;

Perder el juego
Si el marcador de vidas llegase a cero, el jugador habrá perdido la partida y lanzaremos la escena correspondiente.
Te recuerdo el código para cambiar de escena que ya vimos en el juego de Elige tu propia aventura.
UnityEngine.SceneManagement.SceneManager.LoadScene ("GameOver");