Resumen

Comprender cómo un objeto puede comunicar acciones a otros sin depender directamente de ellos es fundamental en el desarrollo con Unity. Los delegates ofrecen exactamente esa capacidad: actúan como un tipo de dato especial que almacena referencias a uno o más métodos, permitiendo ejecutarlos de forma dinámica con una sola llamada.

¿Qué es un delegate y por qué es útil en Unity?

Un delegate es un tipo de dato que guarda dentro de sí uno o más métodos [0:08]. En lugar de llamar funciones directamente, se asignan al delegate y luego se invocan a través de él. Esto resulta especialmente útil cuando se necesita que varios objetos reaccionen ante una misma acción sin acoplarlos entre sí.

Para trabajar con delegates en Unity, se comienza creando un script llamado Game Manager [0:22]. Unity reconoce este nombre y le asigna automáticamente el ícono de engranaje, lo que indica que es un componente de gestión del juego en la escena.

¿Cómo se declara e instancia un delegate?

La declaración de un delegate sigue una estructura clara:

  • Se define el modificador de acceso (en este caso private).
  • Se indica el tipo de retorno (void si no devuelve nada).
  • Se le asigna un nombre descriptivo.

csharp private delegate void SimpleMessage();

Una vez declarado, se necesita crear una instancia del delegate para poder asignarle métodos [1:05]:

csharp SimpleMessage simpleMessage;

¿Cómo se asigna y ejecuta un método dentro de un delegate?

Dentro del método Start, se asigna un método al delegate. Primero se crea la función que será almacenada [1:22]:

csharp private void SendConsoleMessage() { Debug.Log("Mensaje enviado a consola"); }

Luego, se asigna esa función al delegate y se invoca [1:40]:

csharp void Start() { simpleMessage = SendConsoleMessage; simpleMessage.Invoke(); }

Al presionar Play en Unity, la consola muestra "Mensaje enviado a consola", confirmando que el delegate recibió y ejecutó correctamente el método asignado [2:04].

¿Cómo agregar múltiples métodos a un mismo delegate?

Una de las ventajas más poderosas de los delegates es la capacidad de almacenar varios métodos simultáneamente [2:20]. En lugar de usar el operador =, se utiliza += para agregar métodos adicionales:

csharp simpleMessage += SendConsoleMessage;

Esto permite que, con una sola invocación del delegate, se ejecuten acciones desde distintos objetos. Es una forma eficiente de coordinar comportamientos sin que cada objeto conozca directamente a los demás.

¿Cómo verificar que un delegate tiene métodos asignados antes de invocarlo?

Antes de llamar a un delegate, es buena práctica comprobar que no sea nulo, es decir, que tenga al menos un método almacenado [2:42]:

csharp if (simpleMessage != null) { simpleMessage.Invoke(); }

Esta validación evita errores en tiempo de ejecución. Al probar nuevamente en Unity, el mensaje se muestra correctamente en consola, confirmando que el delegate contiene algo y que la verificación funciona como se espera [2:55].

¿Cuál es la diferencia entre delegates y eventos en Unity?

Los delegates son la base sobre la que se construyen los eventos, un mecanismo aún más sencillo para notificar a otros objetos que un estado cambió [3:06]. Mientras un delegate expone la posibilidad de ser reasignado completamente, los eventos restringen esa capacidad para mayor seguridad en la comunicación entre componentes.

Si quieres profundizar en cómo los eventos simplifican la comunicación entre objetos en Unity, comparte tus dudas o experiencias usando delegates en tus proyectos.