Cómo implementar un GameManager en Unity paso a paso (ejemplo indie real)

El GameManager es uno de los conceptos más importantes —y a la vez más mal entendidos— en el desarrollo de videojuegos con Unity. Muchos proyectos indie comienzan sin uno y, conforme el juego crece, terminan con lógica desordenada, dependencias innecesarias y errores difíciles de rastrear.
En este artículo vamos a implementar un GameManager en Unity paso a paso, con un ejemplo realista pensado para proyectos indie. El objetivo es crear una base sólida, clara y reutilizable.
Qué es un GameManager y por qué lo necesitas
El GameManager es un componente central que se encarga de coordinar el estado general del juego. No controla directamente al jugador ni a los enemigos, sino que actúa como el punto de referencia para sistemas globales.
Un GameManager bien implementado permite:
- Controlar el flujo del juego
- Manejar estados como menú, gameplay o pausa
- Centralizar reglas generales
- Reducir dependencias entre sistemas
En proyectos indie, esto marca la diferencia entre un prototipo y un proyecto escalable.
Definiendo el alcance del GameManager
Antes de escribir código, es importante definir qué hará y qué no hará el GameManager. Uno de los errores más comunes es convertirlo en un “script dios” que lo controla todo.
Para este ejemplo, el GameManager se encargará de:
- Gestionar el estado del juego
- Controlar inicio, pausa y fin de partida
- Comunicar eventos globales
No manejará lógica específica del jugador, enemigos o UI.
Creando la estructura base del GameManager
Primero, crea una carpeta llamada Scripts/Managers y dentro un script llamado GameManager.cs.
La estructura básica del script puede verse así:
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
Este patrón asegura que exista una sola instancia del GameManager durante toda la ejecución del juego.
Manejando estados del juego
Un enfoque limpio es definir los estados del juego mediante un enum.
public enum GameState
{
Menu,
Playing,
Paused,
GameOver
}
Luego, el GameManager puede mantener y controlar el estado actual:
public GameState CurrentState { get; private set; }
public void SetGameState(GameState newState)
{
CurrentState = newState;
}
Esto permite que otros sistemas consulten el estado sin modificarlo directamente.
Conectando el GameManager con otros sistemas
En lugar de que el GameManager controle todo, los demás sistemas pueden consultar o reaccionar a cambios de estado.
Por ejemplo, la UI puede preguntar si el juego está en pausa, o el jugador puede bloquear movimiento si el estado no es Playing.
Este enfoque reduce el acoplamiento y mantiene el código limpio.
Errores comunes al implementar un GameManager
- Agregar lógica específica del gameplay
- Acceder directamente a demasiados objetos
- No definir claramente su responsabilidad
- Usarlo como solución rápida para todo
Un GameManager debe coordinar, no controlar cada detalle.
Escalando el GameManager en proyectos indie
Conforme el proyecto crece, el GameManager puede apoyarse en otros managers especializados, como AudioManager o SaveManager.
Esto mantiene el sistema modular y fácil de extender sin reescribir grandes partes del código.
Un pilar para tu arquitectura indie
Implementar un GameManager desde el inicio es una de las mejores decisiones que puedes tomar como desarrollador indie en Unity. No solo mejora la organización del código, sino que facilita el crecimiento del proyecto y reduce errores.
Un buen GameManager no hace magia, pero sí mantiene todo bajo control.


