Unity 3D Scripting Corutinas

3
Unity 3D Scripting: Corutinas Este apartado a muchos les ha sido sumamente complicado por lo que he visto en internet pero es mucho, muchísimo mas sencillo de lo que a priori puede parecer. Para empezar, decir que una corutina se comporta como un hilo, pero no lo es. Para quien no sepa que es un hilo en programación, es como una ejecución aparte, un ejemplo sencillo que se me ocurre es que el navegador web desde el que ves este blog se ejecuta a través de un hilo y en cambio el unity3D se ejecuta en otro hilo aparte, son procesos independientes que si bien podrían comunicarse, durante la ejecución cada uno va por separado, eso tiene sus ventajas y sus desventajas que si bien podría explicar mas detalladamente esto, no lo haré aquí por una sencilla razón, las corutinas se comportan como hilos independientes pero no lo son. Es decir, una corutina hará algo durante un tiempo determinado pero no puede por ejemplo tener un bucle infinito ya que haría que el resto de procesos se bloqueasen hasta que saliese de ese bucle ya que no es independiente. Después de dejar claro eso empecemos con el ejemplo. using UnityEngine; using System.Collections; public class EnemyMaker : MonoBehaviour { public float tiempo = 2; void Start() { StartCoroutine("corutina", tiempo); } IEnumerator corutina(float t) { while(true) { yield return new WaitForSeconds(tiempo); Debug.Log(Time.time); } } }

description

Unity 3D Scripting Corutinas

Transcript of Unity 3D Scripting Corutinas

  • Unity 3D Scripting: Corutinas Este apartado a muchos les ha sido sumamente complicado por lo que he visto en internet pero es mucho, muchsimo mas sencillo de lo que a priori puede parecer. Para empezar, decir que una corutina se comporta como un hilo, pero no lo es. Para quien no sepa que es un hilo en programacin, es como una ejecucin aparte, un ejemplo sencillo que se me ocurre es que el navegador web desde el que ves este blog se ejecuta a travs de un hilo y en cambio el unity3D se ejecuta en otro hilo aparte, son procesos independientes que si bien podran comunicarse, durante la ejecucin cada uno va por separado, eso tiene sus ventajas y sus desventajas que si bien podra explicar mas detalladamente esto, no lo har aqu por una sencilla razn, las corutinas se comportan como hilos independientes pero no lo son. Es decir, una corutina har algo durante un tiempo determinado pero no puede por ejemplo tener un bucle infinito ya que hara que el resto de procesos se bloqueasen hasta que saliese de ese bucle ya que no es independiente. Despus de dejar claro eso empecemos con el ejemplo. using UnityEngine;

    using System.Collections;

    public class EnemyMaker : MonoBehaviour {

    public float tiempo = 2;

    void Start()

    {

    StartCoroutine("corutina", tiempo);

    }

    IEnumerator corutina(float t)

    {

    while(true)

    {

    yield return new WaitForSeconds(tiempo);

    Debug.Log(Time.time);

    }

    }

    }

  • Bien, vamos a explicar paso por paso que estamos haciendo aqu. void Start()

    {

    StartCoroutine("corutina", tiempo); } Empezamos a ejecutar nuestra corutina, simplemente le pasamos el nombre entre comillas y en caso de tener alguna variable, pues la variable que le queramos pasar, objeto o lo que fuese. Ahora veamos que hace nuestra corutina:

    IEnumerator corutina(float t)

    {

    while(true)

    {

    yield return new WaitForSeconds(t);

    Debug.Log(Time.time);

    }

    } Toda corutina debe empezar de esta manera:

    IEnumerator nombreCorutina(parametros) En este caso una vez empieza, tenemos esto:

    while(true){} Una forma, a mi parecer elegante de decir siempre, y ahora pasemos a lo importante de las corutinas, como bien dije, si tenemos un bucle infinito de una corutina, al no ser un hilo diferente estara el programa constantemente haciendo lo de dentro del bucle, pero si hay algo que tienen de especial es lo siguiente:

    yield return new WaitForSeconds(t);

  • En este caso le estamos diciendo que pause la corutina durante un tiempo determinado, en este caso el tiempo que haya en la variable t, siendo 2 en el caso que tenemos de ejemplo. Que pasa mientras est en espera? pues deja la corutina en segundo plano y sigue con el resto de procesos del videojuego, cuando terminen esos dos segundos volver por donde iba en nuestra corutina, que en este caso sera:

    Debug.Log(Time.time); El cual nos devolver el tiempo actual por consola. Si una corutina termina, vease, tal que as:

    IEnumerator corutina(float t) {

    Debug.Log(Time.time); } la corutina finaliza como una funcin normal y corriente y sale de la memoria definitivamente. Para finalizar, no solo tiene esa pausa por segundos, existen tres tipos de pausa. yield return new WaitForSeconds(float tiempo); //espera un tiempo dado en segundos

    yield return new WaitForEndOfFrame(); //espera a que termine el frame

    yield return new WaitForFixedUpdate(); //espera a la funcin FixedUpdate()

    Por si te lo preguntas no, no se pueden usar estas pausas en otras funciones, solo en corutinas.