Sistema de eventos en Unity para proyectos indie (desacopla tu código)

Uno de los problemas más comunes en proyectos indie hechos con Unity es el alto acoplamiento entre scripts. El jugador controla la UI, la UI modifica el GameManager, los enemigos acceden directamente al HUD, y el código se vuelve frágil y difícil de mantener.

La solución a este problema es implementar un sistema de eventos. En este artículo aprenderás cómo crear y usar un sistema de eventos en Unity pensado específicamente para proyectos indie, con un enfoque práctico y fácil de aplicar.


Qué es un sistema de eventos y por qué es tan importante

Un sistema de eventos permite que distintos componentes del juego se comuniquen sin conocerse directamente. En lugar de llamar métodos entre scripts, un sistema emite eventos y otros sistemas reaccionan a ellos.

Esto permite:

  • Reducir dependencias entre scripts
  • Facilitar el mantenimiento del código
  • Escalar el proyecto sin romper sistemas existentes
  • Reutilizar lógica en otros juegos

En proyectos indie, donde el código evoluciona constantemente, esto es una ventaja enorme.


Problema común: código fuertemente acoplado

Sin eventos, es común encontrar situaciones como estas:

  • El jugador modifica directamente la UI
  • El enemigo accede al GameManager para actualizar puntuación
  • La UI depende del jugador para mostrar información

Este tipo de dependencias hace que cualquier cambio genere errores en cadena.


Enfoque recomendado para proyectos indie

Para proyectos indie no es necesario un sistema complejo. Unity ya ofrece herramientas suficientes para crear un sistema de eventos simple, claro y eficiente.

El enfoque que usaremos se basa en:

  • Eventos estáticos
  • Delegates y Actions
  • Suscripción y desuscripción controlada

Creando un sistema de eventos simple

Crea un script llamado GameEvents.cs dentro de Scripts/Core o Scripts/Managers.


using System;
using UnityEngine;

public static class GameEvents
{
    public static Action OnGameStarted;
    public static Action OnGamePaused;
    public static Action OnGameOver;
}

Este archivo será el punto central de los eventos globales del juego.


Disparando eventos desde el GameManager

El GameManager puede emitir eventos cuando el estado del juego cambia:


public void StartGame()
{
    GameEvents.OnGameStarted?.Invoke();
}

public void PauseGame()
{
    GameEvents.OnGamePaused?.Invoke();
}

public void EndGame()
{
    GameEvents.OnGameOver?.Invoke();
}

El GameManager no sabe quién escucha estos eventos, solo los dispara.


Escuchando eventos desde otros sistemas

Otros scripts pueden suscribirse a los eventos sin depender del GameManager.


private void OnEnable()
{
    GameEvents.OnGameStarted += HandleGameStarted;
}

private void OnDisable()
{
    GameEvents.OnGameStarted -= HandleGameStarted;
}

private void HandleGameStarted()
{
    // Lógica específica del sistema
}

Esto permite que cada sistema reaccione de forma independiente.


Eventos y UI: un caso de uso ideal

La UI es uno de los sistemas que más se beneficia del uso de eventos. En lugar de consultar constantemente el estado del juego, la UI puede reaccionar automáticamente.

Por ejemplo, mostrar u ocultar el menú de pausa cuando se dispara el evento correspondiente.

Este enfoque hace que la UI sea más limpia y fácil de modificar.


Buenas prácticas al usar eventos en Unity

  • Desuscribirse siempre en OnDisable
  • No abusar de eventos globales
  • Usar nombres claros y descriptivos
  • Evitar lógica compleja dentro del evento

Los eventos deben comunicar, no ejecutar gameplay complejo.


Escalando el sistema de eventos

A medida que el proyecto crece, puedes crear eventos específicos para sistemas concretos, o incluso usar Scriptable Objects como canales de eventos.

Lo importante es mantener el desacoplamiento y la claridad.


Conclusión: código más limpio, proyectos más sanos

Implementar un sistema de eventos en Unity es una de las mejores decisiones que puedes tomar en un proyecto indie. Reduce el acoplamiento, mejora la mantenibilidad y facilita la escalabilidad.

Si quieres avanzar como desarrollador indie, aprender a trabajar con eventos es un paso fundamental.