Version: 2019.4
Event System
Input Modules (Módulos de Input)

Messaging System (Sistema de Mensajería)

El nuevo sistema de UI utiliza un messaging system (sistema de mensajería) diseñado para remplazar SendMessage. El sistema es puramente C# y apunta a abarcar algunos de los problemas presentes con SendMessage. El sistema funciona utilizando interfaces personalizadas que pueden ser implementas en MonoBehaviour para indicar que el componente es capaz de recibir un callback del sistema de mensajería. Cuando la llamada es hecha, un GameObject objetivo es especificado; la llamada será emitida en todos los componentes del GameObject que implementan la infería específica que la llamada está emitida contra. El sistema de mensajería permite que datos del usuario personalizados sean pasados; así como hasta qué punto a través de la jerarquía del GameObject el evento debería ser propagado; esto es que debería ser ejecutado para el GameObject especifico, o debería también ejecutarse en hijos y padres. En adición a esto, el framework de mensajería proporciona funciones de ayuda para buscar y encontrar GameObjects que implementan un interfaz de mensajería dada.

El sistema de mensajería es genérico y diseñado para el uso no solo por el sistema de UI pero también por código de juego general. Es relativamente trivial agregar eventos de mensajería personalizados y estos van a funcionar utilizando la misma framework que el sistema Ui utiliza para todo el manejo de eventos.

Cómo Defino un Mensaje Personalizado?

Si usted desea definir un mensaje personalizado es relativamente simple. En el namespace UnityEngine.EventSystems hay una interfaz base llamada ‘IEventSystemHandler’. Cualquier cosa que extienda de esto puede ser considerado como un objetivo para recibir eventos vía el sistema de mensajería.

public interface ICustomMessageTarget : IEventSystemHandler
{
    // functions that can be called via the messaging system
    void Message1();
    void Message2();
}

Una vez esta interfaz haya sido definido entonces puede ser implementado por un MonoBehavior. Cuando sea implementando, éste define las funciones que serán ejecutadas si el mensaje dado es emitido contra ese GameObject de MonoBehaviours.

public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
    public void Message1()
    {
        Debug.Log ("Message 1 received");
    }

    public void Message2()
    {
        Debug.Log ("Message 2 received");
    }
}

Ahora que un script existe que puede recibir el mensaje, nosotros necesitamos emitir el mensaje. Normalmente esto sería en respuesta a algún evento débilmente acoplado que ocurre. Por ejemplo, en el sistema UI nosotros emitimos eventos para tales cosas como PointerEnter y PointerExit, al igual que una variedad de otras cosas que pueden suceder en respuesta al input del usuario a la aplicación.

Para enviar un mensaje, una clase estática de ayuda existe para esto. Como argumentos, requiere un objeto objetivo para el mensaje, algunos datos específicos del usuario, y un funtor que mapea a la función específica en la interfaz de mensajes que usted desea orientarse.

ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());

Este código va a ejecutar la función Message1 en cualquier componente en el GameObject objetivo que implemente la interfaz ICustomMessageTarget. La documentación de scripting para la clase ExecuteEvents cubre otras formas de Execute (Ejecutar) funciones, como Executing (Ejecutar) en hijos o padres.

Event System
Input Modules (Módulos de Input)