domingo, 22 de mayo de 2016

Unity Events


Antes de seguir con las clases personalizadas y usos prácticos en Unity quería mostrarle los eventos eventos de Unity, esos eventos que vemos en las interfaces UI y que podemos usar en nuestros propios scripts, aunque son muy útiles y fáciles de usar por alguna razón no están muy documentados, para aprender de ellos tuve que analizar el código de fuente del UI.

Procedamos a hacer nuestro propio evento :


using UnityEngine;
using System.Collections;
using UnityEngine.Events;

public class TestUnityEvent : MonoBehaviour {

    public UnityEvent OnStart = new UnityEvent();

 // Use this for initialization
 void Start () {
        OnStart.Invoke();
    }
 
 // Update is called once per frame
 void Update () {
 
 }
}

Primeramente agregamos using UnityEngine.Events; en la parte superior de nuestro código, luego creamos un evento de tipo UnityEvent y le ponemos el nombre que queramos, en este caso le puse OnStart porque lo ejecutaré en el metodo Start, luego para llamar al evento usamos el nombre del evento mas .Invoke() de esta manera se ejecuta el evento, como pueden ver es muy fácil, al agregar el script a un objeto en escena se verá de la siguiente manera:


De esta manera podemos usar estos útiles eventos que son muy dinámicos ya que nos dejan de manera visual ejecutar métodos de otros scripts, modificar objetos en la escena, etc.

Si necesitamos enviar un valor junto con el evento, por ejemplo como el que usa el InputField el cual nos envía un string cada vez que el usuario actualiza el valor o cuando presiona enter para terminar :


Para hacer este tipo de evento basta con que hagamos una clase que herede de UnityEvents y entre los simbolos ' < > ' agreguemos el valor que queremos que devuelva aquí el codigo ejemplo para string

[System.Serializable]
public class UnityEventString : UnityEngine.Events.UnityEvent<string>
{

}

La clase no necesita tener nada en especial, sólo que herede de UnityEngine.Events.UnityEvent y declare los tipos que quiere devolver además de usar el atributo System.Serializable como expliqué en mi anterior post el atributo sirve para mostrar las clases en el inspector de Unity (en realidad hace más que eso, pero en este caso lo usamos para eso). Para usarla debemos declarar una variable del tipo de la clase que hicimos e invocar nuevamente el metodo ".Invoke( valorString )"

using UnityEngine;
using System.Collections;
using UnityEngine.Events;

public class TestUnityEvent : MonoBehaviour {

    public UnityEvent OnStart = new UnityEvent();
    public UnityEventString OnStart2 = new UnityEventString();

    // Use this for initialization
    void Start () {
        OnStart.Invoke();
        OnStart2.Invoke("Hola mundo");
    }
 
 // Update is called once per frame
 void Update () {
 
 }
}

[System.Serializable]
public class UnityEventString : UnityEngine.Events.UnityEvent<string>
{

}



De esta simple manera podemos usar estos poderosos y dinámicos eventos en nuestros juegos, cualquier duda o sugerencia al respecto dejarla en los comentarios!.

2 comentarios: