Saltar a contenido

Módulo 7 — Fondo espacial, Game Over y reintentar (25 min)

¿Qué vamos a lograr?

Primero, un fondo espacial detrás de todo lo demás (hasta ahora jugamos sobre el color plano de la cámara). Después, cuando la nave muera: un panel con el puntaje final y un botón Reintentar que vuelve a empezar la partida de cero — reemplazando el Time.timeScale = 0 provisional del Módulo 6.

7.1 Agregar un fondo espacial

  1. Del pack de Kenney, busca la carpeta Backgrounds (trae varias imágenes de espacio con estrellas). Arrastra una hacia Assets/Sprites si todavía no la importaste.
  2. Arrastra esa imagen directamente desde el Project hacia la Hierarchy (o hacia la Scene view). Esto crea un GameObject nuevo con un Sprite Renderer ya apuntando a esa imagen. Renómbralo a Background y ubícalo en la posición X=0, Y=0, Z=0.
  3. En el Sprite Renderer, cambia Draw Mode de Simple a Tiled. Van a aparecer campos Size (ancho y alto): subilos hasta que el fondo cubra toda la vista de la cámara en el Game view (por ejemplo, Width = 20, Height = 12 es un buen punto de partida). A diferencia de agrandar con la Scale del Transform, Tiled repite la imagen en vez de estirarla, así que no se ve borrosa ni deformada.
  4. En Additional Settings, bájale el Order in Layer a -10. Todo lo demás en el juego usa 0 por defecto, así que con un número más chico el fondo siempre queda detrás de la nave, las balas, los meteoritos y los enemigos.

Inspector de Background: Draw Mode Tiled, Size y Order in Layer -10

Fondo espacial cubriendo toda la pantalla, detrás de la nave

7.2 Crear el panel de Game Over

Dentro del Canvas que ya tenemos (junto a TextoPuntaje y TextoVida):

  1. Clic derecho sobre Canvas > UI > Panel. Renómbralo a PanelGameOver. Por defecto ocupa toda la pantalla con un fondo gris semitransparente — es justo lo que queremos para oscurecer el juego detrás.
  2. Dentro de PanelGameOver, clic derecho > UI > Text - TextMeshPro. Renómbralo a TextoGameOver, escribe GAME OVER y ponle un tamaño de fuente grande, centrado.
  3. De nuevo dentro de PanelGameOver, otro UI > Text - TextMeshPro. Renómbralo a TextoPuntajeFinal, con el texto de prueba Puntaje final: 0, ubicado debajo del título.
  4. Otra vez dentro de PanelGameOver, clic derecho > UI > Button - TextMeshPro. Renómbralo a BotonReintentar. Dentro de él hay un hijo de texto: cámbialo a Reintentar.
  5. Con PanelGameOver seleccionado, desmarca la casilla que está junto a su nombre, arriba del Inspector. Así arranca oculto, y solo lo vamos a mostrar por código cuando la nave muera.

Hierarchy con Canvas > PanelGameOver y sus tres hijos

7.3 Conectar el panel al GameManager

El GameManager ya está actualizado con lo necesario:

using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;

// Administra el estado general de la partida: puntaje, vida y el fin del juego.
public class GameManager : MonoBehaviour
{
    public static GameManager instancia;

    [Header("Puntaje")]
    public TMP_Text textoPuntaje;

    [Header("Vida")]
    public TMP_Text textoVida;

    [Header("Game Over")]
    public GameObject panelGameOver;
    public TMP_Text textoPuntajeFinal;

    private int puntaje = 0;

    void Awake()
    {
        instancia = this;
    }

    void Start()
    {
        ActualizarTextoPuntaje();
    }

    public void SumarPuntos(int cantidad)
    {
        puntaje += cantidad;
        ActualizarTextoPuntaje();
    }

    void ActualizarTextoPuntaje()
    {
        textoPuntaje.text = "Puntaje: " + puntaje;
    }

    public void ActualizarVida(int vidaActual, int vidaMaxima)
    {
        textoVida.text = "Vida: " + vidaActual + "/" + vidaMaxima;
    }

    public void TerminarJuego()
    {
        // Time.timeScale = 0 congela todo lo que dependa de Time.deltaTime o de la
        // física (el movimiento de meteoritos y enemigos incluido).
        Time.timeScale = 0f;

        textoPuntajeFinal.text = "Puntaje final: " + puntaje;
        panelGameOver.SetActive(true);
    }

    // Conectado al botón "Reintentar" desde el Inspector (Button > On Click).
    public void Reintentar()
    {
        // Hay que devolver el tiempo a la normalidad antes de recargar la escena:
        // si no, la escena nueva también empezaría congelada.
        Time.timeScale = 1f;

        // Recargar la misma escena reinicia todo (posiciones, vida, puntaje, spawners)
        // sin que tengamos que escribir código para "resetear" cada cosa a mano.
        Scene escenaActual = SceneManager.GetActiveScene();
        SceneManager.LoadScene(escenaActual.name);
    }
}
  1. Selecciona el GameObject GameManager.
  2. Arrastra PanelGameOver (desde la Hierarchy) al campo Panel Game Over.
  3. Arrastra TextoPuntajeFinal al campo Texto Puntaje Final.

Inspector de GameManager con Panel Game Over y Texto Puntaje Final asignados

7.4 Conectar el botón Reintentar

  1. Selecciona BotonReintentar.
  2. En su componente Button, en la sección On Click (), hace clic en + para agregar un evento.
  3. Arrastra el GameObject GameManager al campo de objeto que aparece.
  4. En el desplegable de función, elige GameManager > Reintentar ().

Inspector de BotonReintentar con On Click conectado a GameManager.Reintentar

7.5 Probar todo junto

Presiona Play, deja que la nave muera (por un meteorito o quedándose sin vida), y confirma que:

  • El juego se congela y aparece el panel con GAME OVER y el puntaje final correcto.
  • Al hacer clic en Reintentar, la escena se recarga de cero: la nave vuelve a tener toda su vida, el puntaje vuelve a 0, y los spawners empiezan de nuevo desde el intervalo inicial.

Jugando en modo Play: panel de Game Over con el puntaje final

Checkpoint ✅

Al terminar este módulo, el juego debería tener un ciclo completo y jugable de principio a fin: fondo espacial, movimiento, disparo, meteoritos, enemigos, dificultad progresiva, puntaje, vida, y un Game Over con la opción de volver a intentarlo.