Qué es un UnityEvent#
Un UnityEvent es un evento que se puede conectar desde el Inspector, arrastrando objetos y eligiendo qué método llamar, sin escribir una línea. Es lo que hace el componente Button: su lista On Click () es un UnityEvent. Ver botones y UI.
Añadir uno a tu propio script#
using UnityEngine;
using UnityEngine.Events;
public class Cofre : MonoBehaviour
{
// Aparece en el Inspector como una lista arrastrable
public UnityEvent alAbrir;
public void Abrir()
{
// Dispara todo lo conectado en el Inspector
alAbrir.Invoke();
}
}En el Inspector, Cofre mostrará el evento Al Abrir (). Le arrastras un altavoz → AudioSource.Play, unas partículas → ParticleSystem.Play, y un texto → tu método MostrarRecompensa(). Todo sin tocar el código del cofre: un diseñador puede montar la reacción.
Para pasar un dato (por ejemplo, la vida actual a una barra), usa la versión genérica: public UnityEvent<int> alCambiarVida; y alCambiarVida.Invoke(vida);. En el Inspector, el método destino debe aceptar ese tipo.
Conectar por código#
También puedes suscribirte en tiempo de ejecución:
void Start()
{
alAbrir.AddListener(Reproducir); // añadir
}
void OnDestroy()
{
alAbrir.RemoveListener(Reproducir); // limpiar
}UnityEvent vs evento de C##
No compiten: resuelven cosas distintas. Ver eventos y delegados para los eventos puros de C#.
| UnityEvent | event / Action de C# | |
|---|---|---|
| Se conecta en el Inspector | Sí (su gran ventaja) | No |
| Lo montan diseñadores sin código | Sí | No |
| Rendimiento | Algo más lento (reflexión) | Muy rápido |
| Genera basura al invocar | Un poco | Casi nada |
| Ideal para | UI, reacciones configurables en escena | Lógica de código, sistemas, alta frecuencia |
- ¿Quieres que se configure en el editor (botones, triggers, cutscenes)? → UnityEvent
- ¿Comunicación entre sistemas por código, o algo que se dispara muchísimo por fotograma? → event / Action de C#
- ¿Eventos globales desacoplados entre escenas? → considera un ScriptableObject como canal de eventos
Rendimiento#
UnityEvent.Invoke usa reflexión y es más lento que un Action. Para eventos puntuales (abrir un cofre, pulsar un botón) es irrelevante. Para algo que se dispara cada fotograma o en bucles calientes, usa un evento de C#.
Errores frecuentes#
- Usar
public UnityEventpara lógica de alta frecuencia (usaAction). - Suscribir con
AddListenerenStarty no quitar enOnDestroy(fugas si el objeto que escucha muere antes). - Esperar que el método destino del Inspector sea
private: debe ser público para aparecer en la lista. - Confundir el UnityEvent con
eventde C#: el primero se cablea en el editor, el segundo no.
Ponte a prueba#
Resumen#
Un UnityEvent es un evento cableable desde el Inspector: expones public UnityEvent y llamas Invoke(), y en el editor conectas reacciones (sonido, partículas, métodos) sin tocar código. Perfecto para UI, triggers y cutscenes configurables por diseñadores. Para lógica de código o alta frecuencia, usa los eventos de C#, que son más rápidos. No se excluyen: cada uno tiene su terreno.