Patrones en Unity: Singleton y State Machine

Organiza sistemas globales y comportamientos complejos con patrones de diseño aplicados al desarrollo real en Unity.

Singleton resuelve casos donde necesitas una única instancia global, como `GameManager`, audio maestro o progreso de sesión.

State Machine evita cadenas enormes de condicionales al modelar comportamientos por estados explícitos (Idle, Chase, Attack).

Usar patrones no es copiar plantillas: es decidir cuándo reducen complejidad y cuándo introducirían sobrearquitectura.

Según `contenido.md`, esta lección es clave para estructurar lógicas complejas de IA y estado global del juego.

  • Úsalo para coordinar sistemas globales, no para esconder dependencias en todo el proyecto.
  • Un Singleton en Unity suele definirse con un campo `static Instance` y validación en `Awake()` para impedir duplicados.
  • `DontDestroyOnLoad` permite mantener esa instancia viva al cambiar de escena, útil para audio o estado de partida.
  • Si todo termina accediendo al Singleton, revisa diseño: puede convertirse en acoplamiento excesivo si no delimitas responsabilidades.
  • Una sola instancia global controlada.

Singleton en contexto real

Úsalo para coordinar sistemas globales, no para esconder dependencias en todo el proyecto.

Un Singleton en Unity suele definirse con un campo `static Instance` y validación en `Awake()` para impedir duplicados.

`DontDestroyOnLoad` permite mantener esa instancia viva al cambiar de escena, útil para audio o estado de partida.

Si todo termina accediendo al Singleton, revisa diseño: puede convertirse en acoplamiento excesivo si no delimitas responsabilidades.

  • Una sola instancia global controlada.
  • Persistencia opcional entre escenas.
  • Evitar convertirlo en un objeto dios.

State Machine para IA y flujo de gameplay

Cuando un sistema crece, modelar estados explícitos simplifica decisiones y depuración.

Con una máquina de estados defines qué puede hacer cada entidad en cada momento y qué dispara el cambio de estado.

Esto reduce `if/else` anidados y hace más sencillo añadir nuevos comportamientos sin romper lo existente.

En NPCs típicos puedes pasar de `Patrol` a `Chase` y luego a `Attack` según distancia, línea de visión o vida.

Errores frecuentes al aplicar patrones

El patrón correcto mal aplicado puede empeorar el sistema.

Crear Singletons para todo complica pruebas y acopla módulos que deberían ser independientes.

Una State Machine sin límites claros de transición puede provocar bugs difíciles de reproducir.

Define reglas de transición explícitas y registra cambios de estado en consola durante fases de debug.

Unity
16

Patrones en Unity: Singleton y State Machine

Organiza sistemas globales y comportamientos complejos con patrones de diseño aplicados al desarrollo real en Unity.

Código del tema: GameObject + Component = comportamiento

📘 Teoría

Singleton en contexto real

Úsalo para coordinar sistemas globales, no para esconder dependencias en todo el proyecto.

Un Singleton en Unity suele definirse con un campo `static Instance` y validación en `Awake()` para impedir duplicados.

`DontDestroyOnLoad` permite mantener esa instancia viva al cambiar de escena, útil para audio o estado de partida.

Si todo termina accediendo al Singleton, revisa diseño: puede convertirse en acoplamiento excesivo si no delimitas responsabilidades.

  • Una sola instancia global controlada.
  • Persistencia opcional entre escenas.
  • Evitar convertirlo en un objeto dios.

State Machine para IA y flujo de gameplay

Cuando un sistema crece, modelar estados explícitos simplifica decisiones y depuración.

1

Con una máquina de estados defines qué puede hacer cada entidad en cada momento y qué dispara el cambio de estado.

2

Esto reduce `if/else` anidados y hace más sencillo añadir nuevos comportamientos sin romper lo existente.

3

En NPCs típicos puedes pasar de `Patrol` a `Chase` y luego a `Attack` según distancia, línea de visión o vida.

Singleton + estado básico
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }

        Instance = this;
        DontDestroyOnLoad(gameObject);
    }
}

public enum EnemyState { Idle, Patrol, Chase, Attack }

public class EnemyBrain : MonoBehaviour
{
    public EnemyState currentState = EnemyState.Idle;

    void Update()
    {
        switch (currentState)
        {
            case EnemyState.Idle:
                // lógica de espera
                break;
            case EnemyState.Chase:
                // lógica de persecución
                break;
        }
    }
}

Errores frecuentes al aplicar patrones

El patrón correcto mal aplicado puede empeorar el sistema.

1

Crear Singletons para todo complica pruebas y acopla módulos que deberían ser independientes.

2

Una State Machine sin límites claros de transición puede provocar bugs difíciles de reproducir.

3

Define reglas de transición explícitas y registra cambios de estado en consola durante fases de debug.

🧪 Aprende probando

Ejemplo Ejemplo guiado Implementa un `GameManager` singleton persistente entre escenas con validación de duplicados.

🏁 Retos

Reto Reto práctico Combina un Singleton básico con una State Machine que use `switch` para gestionar estados de un enemigo.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .