Game Manager en Unity: estructura de estados

Clase 16 de 53Curso de C# para Videojuegos

Resumen

Controlar el flujo de un videojuego en Unity exige un Game Manager claro y extensible: define estados con un enum, expone métodos públicos para iniciar, terminar o volver al menú, y centraliza cambios con un único método que actualiza el estado y prepara la escena.

¿Qué es un game manager en Unity y por qué importa?

Un Game Manager es el director que coordina los parámetros globales: pausa, menú principal, partida en marcha y reglas por estado. Unity marca el script con un icono de rueda porque es el engranaje central, fácil de localizar cuando el proyecto crece.

  • Coordina estados: menú, en partida y game over.
  • Centraliza reglas y evita duplicar lógica.
  • Facilita mantenimiento con el enfoque de divide y vencerás.

¿Cómo se crea y por qué aparece el engranaje?

  • Crea un nuevo script C# llamado “GameManager”.
  • Unity lo resalta con un engranaje para ubicarlo rápido entre muchos scripts.
  • Se abre en Visual Studio y hereda de MonoBehaviour como cualquier otro.

¿Qué métodos públicos conviene definir?

  • public void StartGame: inicia la partida.
  • public void GameOver: finaliza cuando el jugador muere.
  • public void BackToMenu: vuelve al menú principal.
  • Recuerda visibilidad: si no indicas nada, es privado; si pones public, es público.
  • Comenta con “//” para documentar tu intención y facilitar futuras revisiones.

¿Cómo estructurar estados del juego con un enum en C#?

Para guardar el estado global usa un enum accesible desde otros scripts. Decláralo fuera de la clase para poder referenciarlo desde, por ejemplo, un Player Controller.

  • enum con tres valores: Menu, InGame, GameOver.
  • Variable pública para el estado actual: comienza en Menu para que el jugador decida cuándo empezar.
  • Un método privado SetGameState centraliza cambios de estado y actualizaciones de escena.
using UnityEngine; public enum GameState { Menu, InGame, GameOver } public class GameManager : MonoBehaviour { public GameState currentGameState = GameState.Menu; // Inicia la partida. public void StartGame() { SetGameState(GameState.InGame); } // Termina la partida. public void GameOver() { SetGameState(GameState.GameOver); } // Vuelve al menú principal. public void BackToMenu() { SetGameState(GameState.Menu); } // Cambia el estado y prepara la escena. private void SetGameState(GameState newGameState) { if (newGameState == GameState.Menu) { // TODO: lógica del menú (mostrar botones, pausar, etc.). } else if (newGameState == GameState.InGame) { // TODO: preparar la escena para jugar (activar personaje, etc.). } else if (newGameState == GameState.GameOver) { // TODO: preparar el juego para el Game Over. } this.currentGameState = newGameState; } }

Piensa este flujo como un semáforo: menú en rojo (se detiene todo), in game en verde (todo activo) y game over en amarillo (transición hacia el menú).

¿Por qué sirve el enfoque divide y vencerás?

  • Separa una tarea grande en subtareas manejables.
  • Reduce errores y acelera depuración.
  • Facilita añadir nuevos estados con cambios mínimos.

¿Cómo implementarlo y probarlo en la escena de Unity?

Nada funciona hasta asignar el script a un GameObject en la escena. La forma habitual es usar un objeto vacío para no acoplar el manager a cámara o personaje.

  • Crea un GameObject vacío: GameObject > create empty.
  • Asigna el script “GameManager” arrastrándolo al Inspector.
  • Opcional: añade un gizmo visual para no perderlo en la escena.
  • Gracias al enum, verás un desplegable en el Inspector para cambiar el estado.
  • Al dar Play, prueba transiciones cambiando entre Menu, InGame y GameOver con un clic.

¿Con ganas de seguir? Comparte cómo organizarías la lógica de menú, in game y game over dentro de SetGameState y qué otras transiciones añadirías.