Sistema de pausa y estados del juego en Unity (Game States para juegos indie)

En todo videojuego existe algo más importante que los gráficos o las mecánicas: el control del flujo del juego. Saber cuándo el jugador puede moverse, cuándo el juego está en pausa o cuándo se muestra un menú es esencial para una experiencia sólida.

En este artículo aprenderás cómo implementar un sistema de pausa y estados del juego (Game States) en Unity, usando una arquitectura clara, escalable y perfecta para proyectos indie.


Qué son los Game States y por qué son importantes

Los Game States representan el estado global del videojuego. Algunos ejemplos comunes son:

  • Playing (jugando)
  • Paused (pausa)
  • Menu (menú principal)
  • GameOver

En lugar de depender de múltiples condiciones dispersas, los Game States permiten controlar todo el juego desde una sola fuente de verdad.


Problemas comunes sin Game States

En muchos proyectos indie sin una arquitectura clara se presentan problemas como:

  • El jugador se mueve mientras el menú está abierto
  • El input sigue activo durante la pausa
  • Lógica duplicada en varios scripts

Un sistema de estados elimina estos errores de raíz.


Definiendo los estados del juego

Comenzamos creando un enum que represente los estados:


public enum GameState
{
    Menu,
    Playing,
    Paused,
    GameOver
}

Esto nos da una base clara y fácil de extender.


GameManager como controlador de estados

El GameManager será el responsable de manejar el estado actual:


using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public GameState CurrentState { get; private set; }

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
            SetState(GameState.Menu);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    public void SetState(GameState newState)
    {
        CurrentState = newState;
        Time.timeScale = newState == GameState.Paused ? 0f : 1f;
    }
}

Con esto, el control del tiempo y del flujo se centraliza completamente.


Implementando el sistema de pausa

El sistema de pausa se activa normalmente desde el input:


if (InputManager.Instance.PausePressed)
{
    if (GameManager.Instance.CurrentState == GameState.Playing)
        GameManager.Instance.SetState(GameState.Paused);
    else if (GameManager.Instance.CurrentState == GameState.Paused)
        GameManager.Instance.SetState(GameState.Playing);
}

Esto garantiza que la pausa solo funcione cuando corresponde.


Deshabilitando sistemas según el estado

Los sistemas del juego pueden consultar el estado actual:


if (GameManager.Instance.CurrentState != GameState.Playing)
    return;

De esta forma, movimiento, enemigos y lógica se detienen sin necesidad de hacks.


Integración con UI y menús

Los Game States son ideales para controlar la interfaz:

  • Mostrar menú de pausa
  • Ocultar HUD
  • Activar pantallas de Game Over

La UI simplemente reacciona al estado actual del juego.


Buenas prácticas para Game States en proyectos indie

  • Usa un solo controlador de estados
  • Evita condiciones repartidas en varios scripts
  • Integra input, UI y lógica al mismo sistema
  • Piensa los estados antes de escribir código

Estas prácticas hacen que el proyecto sea fácil de mantener y escalar.


Conclusión: controla el flujo, mejora tu juego

Implementar un sistema de pausa y Game States en Unity no es opcional para un videojuego indie serio. Es la base para una experiencia pulida y profesional.

Cuando el flujo del juego está bien controlado, todo lo demás funciona mejor.