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.


