Corutinas en Unity

Ya he comentado antes que Unity es un entorno realmente productivo. Una de las features que más tiempo ahorran y más simplifican el código son las corutinas. Es algo que también tiene UnrealScript y podría decirse que es uno de los pilares de la programación en DIV/Fenix.

Digamos que tengo un item que quiero que al colisionar con un jugador, desaparezca suavemente aumentando su transparencia. Y que al cabo de un minuto vuelta a aparecer, de nuevo suavemente. Esto en un motor convencional requeriría tener varias variables de la clase Item para llevar la cuenta del tiempo que llevamos haciendo fading del objeto, el sentido del fading (está apareciendo o desapareciendo?) o el tiempo de espera hasta el respawn. Y además, todo ese código estaría mezclado con el resto de la lógica que queramos que ese item ejecute cada frame, en algún método como Update() o algo similar. Todo eso disparado por algún confuso sistema de detección de colisiones.
En Unity sería algo así:

Corutina de ejemplo escrita en Javascript.

La sentencia yield es equivalente a frame; en DIV/Fenix. En Python tiene el mismo nombre, y en UnrealScript no me acuerdo, pero en todos funciona prácticamente del mismo modo (el contexto en el que pueda usarse ya es otra historia). Básicamente significa “sal de esta función pero mantén el contexto de la misma en memoria, para en el siguiente frame, retomarla justo donde la acabo de dejar”. De este modo puedes definir en una función una serie de eventos o comportamientos que ocurrirán sucesivamente uno detrás de otro en tu simulación, en vez de ejecutarse todos secuencialmente pero en el mismo frame.
Al principio no le veía demasiada utilidad. Después de usarlos me doy cuenta del gran potencial que tienen, sobretodo en cuanto a productividad y mantenimiento del código.

4 respuestas a “Corutinas en Unity”

  1. tamat dice:

    Interesante. Y como se lleva esto con la interaccion simultanea de otros eventos? Qué sucede si quieres congelar la animacion, o el elemento se destruye?

  2. Daniel dice:

    Me ha parecido un tema muy interesante. Conocía las corutinas, pero no sabía aplicarlas. Ahora ya me has dado algunas ideas.

  3. Manuel F. Lara dice:

    @tamat: si el elemento se destruye, sus corutinas se destruyen. Además existen los métodos (piensa que cada script añadido a un GameObject deriva de MonoBehavior. En C# los scripts son clases y en javascript aunque tenga pinta de variables y funciones, son también propiedades y métodos) StopCoroutine(nombre) y StopAllCoroutines() que para todas las corutinas de ese script. Si quieres congelar la animación tendrías que congelar el timer que usa la animación, en este caso Time.deltaTime. Poniendo Time.timeStep = 0 pausarías toda la lógica, aunque si sólo quieres pausar ESA animación, tendrías que usar un timer secundario.

  4. Pogacha dice:

    Muy interesante, yo jamas habia oido hablar de ellas …
    Saludos.

Deja una respuesta