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¶
- Del pack de Kenney, busca la carpeta
Backgrounds(trae varias imágenes de espacio con estrellas). Arrastra una haciaAssets/Spritessi todavía no la importaste. - Arrastra esa imagen directamente desde el Project hacia la Hierarchy (o hacia la
Scene view). Esto crea un GameObject nuevo con un
Sprite Rendererya apuntando a esa imagen. Renómbralo aBackgroundy ubícalo en la posiciónX=0, Y=0, Z=0. - En el Sprite Renderer, cambia Draw Mode de
SimpleaTiled. 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 = 12es un buen punto de partida). A diferencia de agrandar con la Scale del Transform,Tiledrepite la imagen en vez de estirarla, así que no se ve borrosa ni deformada. - En Additional Settings, bájale el Order in Layer a
-10. Todo lo demás en el juego usa0por 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.
7.2 Crear el panel de Game Over¶
Dentro del Canvas que ya tenemos (junto a TextoPuntaje y TextoVida):
- Clic derecho sobre
Canvas> UI > Panel. Renómbralo aPanelGameOver. Por defecto ocupa toda la pantalla con un fondo gris semitransparente — es justo lo que queremos para oscurecer el juego detrás. - Dentro de
PanelGameOver, clic derecho > UI > Text - TextMeshPro. Renómbralo aTextoGameOver, escribeGAME OVERy ponle un tamaño de fuente grande, centrado. - De nuevo dentro de
PanelGameOver, otro UI > Text - TextMeshPro. Renómbralo aTextoPuntajeFinal, con el texto de pruebaPuntaje final: 0, ubicado debajo del título. - Otra vez dentro de
PanelGameOver, clic derecho > UI > Button - TextMeshPro. Renómbralo aBotonReintentar. Dentro de él hay un hijo de texto: cámbialo aReintentar. - Con
PanelGameOverseleccionado, 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.
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);
}
}
- Selecciona el GameObject
GameManager. - Arrastra
PanelGameOver(desde la Hierarchy) al campo Panel Game Over. - Arrastra
TextoPuntajeFinalal campo Texto Puntaje Final.
7.4 Conectar el botón Reintentar¶
- Selecciona
BotonReintentar. - En su componente Button, en la sección On Click (), hace clic en + para agregar un evento.
- Arrastra el GameObject
GameManageral campo de objeto que aparece. - En el desplegable de función, elige 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 OVERy 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.
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.





