Índice del curso de Unity 3D

  1. Introducción
  2. Instalación
  3. Interfaz
  4. Conceptos básicos
  5. Ejercicio: cubos
  6. Cambiar el color de algo
  7. Introducción a C#
  8. Conceptos para realización de juegos 2D
  9. Acceder a componentes desde código
  10. Uso del transform
  11. User Interface
  12. Elije tu propia aventura
  13. Acierta imagen
  14. Fall Down Game
  15. Galería de tiro
  16. Flappy Bird
  17. PONG
  18. Carreras
  19. Panel Animator
  20. Plataformas
  21. Plataformas
  22. Puzzle
  23. Plataformas con RayCast
  24. Memory (juego de las parejas)
  25. Máscara
  26. Publicación
  27. Ejercicio: First Person Shooter

Fall Down Game

Ponemos el fondo de pantalla

fall down game con unity 3D

Un misil cae por gravedad

  1. Añadimos el sprite de un misil a la pantalla.
  2. 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

Panel animation

Muestra las animaciones vinculadas con el objeto activo.

Puedo asignar una animación a un objeto, arrastrando la animación sobre el objeto en el panel de jerarquía o sobre el inspector.

Puedo reutilizar animaciones de desplazamiento, rotación, escala y, para varios objetos. Pero las animaciones consistentes en sprites animados serán solo para un único objeto. De lo contrario, si a un pingüino le pongo una aimación de sprites de un perro andando, el pingüino se convertirá en perro.

Si no queremos que una animación se repita indefinidamente (comportamiento por defecto), seleccionaremos la animación en el panel de proyecto y desmarcaremos la check "loop" en el panel inspector.

Animar frame a frame

Pasos para hacer una animación.

  1. Debemos preparar un sprite dando los siguientes pasos en su panel inspector:
    1. Texture Type: Sprite (2D and UI)
    2. Sprite Mode: Multiple
    3. Sprite Editor
      1. SI -> Slice
        • Type: Automatic
        • Slice
  2. Seleccionamos en el panel de jerarquía el Sprite sobre el que queremos crear la animación -> Panel animation -> create new clip.
    • Creamos la animación reposo. Esta animación tiene una única que imágen que es el sprite del misil
    • Creamos la animación explosión. Esta animación tiene varios sprites, correspondientes a los estados de la explosión.
      • Habrá que ir añadiendo cada uno de estos sprites de uno en uno a la línea de tiempo del panel animation.
      • También podemos seleccionar todos los sprites de la animación (manteniendo shift pulsado mientras seleccionamos) y arrastrarlos de una sola vez a la línea de tiempo.

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");
panel animator unity 3d

Detener la caída por gravedad del objeto

GetComponent<Rigidbody2D>().simulated = false;

Destruir objeto cuando la animación ha terminado

public AnimationClip animationClip;
...
float duracionExplosion = animationClip.length;
Destroy(this.gameObject, duracionExplosion);

Generar un misil cada segundo

Usaremos un código similar al tel temporizado del juego Acierta Imagen.¿Recuerdas?

void temporizador(){
	Debug.Log("Llamada al código");
	Invoke("temporizador", 1.0f);
}

Instanciar un prefab

Un prefab es un GameObject que puede agrupar a su vez varios GameObjects, Scripts, assets, etc y que está empaquetado y prepararado para ser reusado.

Técnicamente, un prefab debe ser un único objeto, por lo que si quisieramos que el prefab constase de varios objetos, deberíamos agruparlos en un empty.

Para crear el prefab, lo arrastraremos del panel de jerarquía, donde lo hemos estado elaborando, hasta el panel de proyecto.

Si tengo varias instancias de un prefab y modifico una de ellas, pulsando el botón apply en el panel inspector, estas modificaciones se aplicarán al resto de prefabs. Si no pulso aplicar, la modificación será únicamente para ese prefab.

Crearemos un prefab arrastrando el objeto deseado desde el panel de jerarquía hasta el panel de proyecto.

Para instanciar un prefab utilizaremos el siguiente código:

public GameObject prefabMisil;
...
GameObject nuevoMisil = Instantiate(prefabMisil, new Vector2(2,2), Quaternion.identity);

Instanciar un misil en una posición horizontal aleatoria

int pos = Random.Range(-4, 4);
GameObject nuevoMisil = Instantiate(prefabMisil, new Vector2(pos,4), Quaternion.identity);

Detectar colisiones

El jugador perderá cuando un misil desaparezca por la parte inferior de la pantalla.

Para detectar esto:

  1. Ponemos un cubo en la parte inferior de la pantalla y lo estiramos para que ocupe toda su longitud.
  2. 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.
  3. En el componente Box Collider 2D del GameObject AreaInferior, activamos la check isTrigger.
  4. Vinculamos el siguiente Script al cubo inferior:
    public class AreaInferior : MonoBehaviour{
    	void OnTriggerEnter2D(Collider2D col){
    		Debug.Log("colision");
    	}
    }

Diferencia entre marcar o no marcar la check isTrigger de un BoxCollider.

  • Cuando la check está marcada, los objetos que colisionan se superponen durante la colisión, pasando uno por encima de otro. El código que usamos para gestionar estas colisiones es similar a este:
    void OnTriggerEnter2D(Collider2D col){
    }
  • Cuando la check no está marcada, los objetos que colisionan impactan entre sí.
    void OnCollisionEnter2D(Collision2D col){
    }

Perder vidas

Cada vez que se produzca la colisión anterior, el usuario perderá una vida.

public class AreaInferior : MonoBehaviour
{
    private int marcador = 3;
    public Sprite corazonNegro;
    void OnCollisionEnter2D(Collision2D col)
    {
        marcador--;

        if(marcador == 2)
        {
            GameObject.Find("vida3").GetComponent<SpriteRenderer>().sprite = corazonNegro;
corazon negro

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.

using UnityEngine.SceneManagement;
SceneManager.LoadScene ("Muerte");
icono de mandar un mail¡Contacta conmigo!
Pablo Monteserín
contacta conmigoPablo Monteserín

Para dudas técnicas sobre los ejercicios de mis cursos es necesario estar suscrito.