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Ã:

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.
March 1st, 2007 a las 11:48 am
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?
March 1st, 2007 a las 1:33 pm
Me ha parecido un tema muy interesante. ConocÃa las corutinas, pero no sabÃa aplicarlas. Ahora ya me has dado algunas ideas.
March 1st, 2007 a las 4:08 pm
@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.
March 6th, 2007 a las 3:04 pm
Muy interesante, yo jamas habia oido hablar de ellas …
Saludos.