C# para Unity · Sección 9

Delegados, eventos y callbacks

Funciones como valores, Action, Func, eventos de C#, UnityEvent y suscripciones simétricas para comunicar sistemas sin dependencias ocultas.

3
lecciones
3
ejercicios resueltos
CONTENIDO ORIGINAL

Avanza en orden. Cada lección está redactada para Palta es Cool, utiliza ejemplos propios y termina con una actividad cuya respuesta puedes desplegar.

ANTES DE EMPEZAR

Ubícate antes de avanzar

01 / PUNTO DE PARTIDA

Conviene haber comprendido Interfaces, genéricos y contratos.

02 / META OBSERVABLE

Al terminar deberías poder relacionar Delegados y lambdas con Eventos y UnityEvent y resolver un caso nuevo.

03 / TIEMPO SUGERIDO

Reserva entre 75 y 120 minutos o divide el laboratorio en dos sesiones.

04 / PREPARA EL LABORATORIO

Instala Unity Hub, una versión LTS compatible y un IDE con integración para C#. Conserva un proyecto de laboratorio separado.

Abrir la guía de herramientas →
Diagnóstico rápido: ¿cómo se relacionan Delegados y lambdas y Eventos y UnityEvent? +

No necesitas acertar todavía. Escribe una hipótesis de dos líneas y compárala con tu respuesta al finalizar; si puedes corregirla y justificar el cambio, hubo aprendizaje.

Ruta guiada · 3 lecciones

Aprende el tema paso a paso

Usarás funciones como valores y notificaciones para desacoplar emisores y receptores sin perder control sobre firma, ciclo de vida y trazabilidad.

Al terminar podrás
  • Delegate, Action y Func describen firmas de funciones
  • event protege la emisión y UnityEvent permite configurar receptores
  • Toda suscripción necesita propietario y momento de liberación
01
Transportar comportamiento

Delegate, Action y Func describen firmas de funciones

Un delegado puede referirse a métodos compatibles. Action no devuelve valor; Func devuelve el tipo indicado al final. Las lambdas sirven para operaciones breves, pero una función con nombre comunica mejor una regla compleja.

01

La firma define parámetros y retorno.

02

La invocación debe contemplar ausencia de suscriptores.

03

Una lambda no debe esconder efectos difíciles de rastrear.

Comprueba lo aprendido · 01

¿Cuál es la diferencia esencial entre Action<int> y Func<int, bool>?

Mostrar respuesta +

Action<int> recibe un entero y no devuelve valor; Func<int, bool> recibe un entero y devuelve un booleano.

02
Publicar cambios

event protege la emisión y UnityEvent permite configurar receptores

Un event de C# solo puede invocarse desde la clase que lo declara y ofrece buena trazabilidad en código. UnityEvent se serializa y conecta desde Inspector, útil para respuestas de diseño, aunque añade sobrecarga y puede ocultar enlaces.

01

Usa event para lógica interna y contratos de código.

02

Usa UnityEvent cuando la conexión editable aporta valor real.

03

Documenta quién emite, con qué datos y cuándo.

Comprueba lo aprendido · 02

¿Por qué un event es más seguro que exponer públicamente un delegate?

Mostrar respuesta +

Los consumidores pueden suscribirse o retirarse, pero no reemplazar la lista ni invocar el evento desde fuera del emisor.

03
Cerrar el ciclo

Toda suscripción necesita propietario y momento de liberación

OnEnable y OnDisable funcionan bien para objetos que entran y salen de participación. Suscribirse con una lambda anónima dificulta retirar exactamente la misma función. Los eventos no sustituyen el diseño del flujo: un exceso puede volver invisible la causalidad.

01

Suscripción y retirada deben ser simétricas.

02

Evita registrar el mismo callback más de una vez.

03

Incluye contexto y datos suficientes en la notificación.

Comprueba lo aprendido · 03

¿Por qué no puedes retirar fácilmente modelo.Cambio -= x => Refrescar(x)?

Mostrar respuesta +

Porque crea otra instancia de delegado; no es la misma que se registró. Usa un método con nombre o conserva el delegado en un campo.

Resumen de la sección

Tu recorrido en tres ideas

  1. Delegate, Action y Func describen firmas de funciones
  2. event protege la emisión y UnityEvent permite configurar receptores
  3. Toda suscripción necesita propietario y momento de liberación
PROFUNDIZACIÓN / LABORATORIO GUIADO

Construye un sistema de vida dirigido por eventos

Integra propiedad del estado, emisión, datos del evento, ciclo del receptor y pruebas contra duplicados.

CASO

HUD, audio y logros deben reaccionar a la vida sin que Salud los conozca ni invoque directamente.

Procedimiento

  1. Define la invariante de vida y el evento con datos suficientes.
  2. Conecta receptores en OnEnable y retíralos en OnDisable.
  3. Aplica daño, cura, desactiva y reactiva cada receptor varias veces.

Evidencia mínima

  • Conteo de invocaciones por cambio.
  • Vida siempre entre cero y máximo.
  • El emisor no referencia tipos de UI, audio o logros.
Mostrar razonamiento modelo +

Salud modifica primero su estado válido y luego emite una notificación. Cada receptor controla su suscripción. El test comprueba tanto valores como que reactivar no multiplique llamadas.

Para ir más lejos

¿Cuándo un flujo directo sería más claro que agregar otro evento?

CIERRE DE LA SECCIÓN

Comprueba que puedes usarlo

Antes de continuar, revisa estos tropiezos frecuentes y resuelve un caso sin copiar los ejemplos.

ERROR 01

Exponer un delegate público que cualquier consumidor pueda reemplazar o invocar.

ERROR 02

Suscribir lambdas anónimas sin conservarlas y luego no poder retirarlas.

DESAFÍO INTEGRADOR

Ahora hazlo sin guía

Haz que salud publique cambios y conecta HUD, audio y logro sin que el emisor conozca a sus receptores.

Mostrar pauta de corrección +
Una respuesta sólida:
  • El evento incluye los datos suficientes y solo lo invoca su propietario.
  • La suscripción es simétrica durante activación y desactivación.
  • Reactivar receptores no duplica llamadas y el flujo puede rastrearse.