Bucles en corrutinas
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 24 de 63.
Un bucle con un yield return dentro se ejecuta durante muchos fotogramas, porque cada iteración se pausa antes de la siguiente. Con WaitForSeconds, el bucle repite algo siguiendo un ritmo. Esta sirena parpadea 3 veces:
IEnumerator Flash()
{
for (int i = 0; i < 3; i++)
{
lamp.enabled = true;
yield return new WaitForSeconds(0.2f);
lamp.enabled = false;
yield return new WaitForSeconds(0.2f);
}
}Con yield return null, el bucle hace un poco en cada fotograma hasta que se cumple su condición; así es como una corrutina anima algo. Este globo, con una escala de 1, crece 0.5 por segundo hasta que su escala alcanza 2; después, informa:
IEnumerator Inflate()
{
while (transform.localScale.x < 2f)
{
transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
yield return null;
}
Debug.Log("Full");
}Time.deltaTime funciona aquí como en Update(): la corrutina se reanuda una vez por fotograma, y la línea que sigue al bucle solo se ejecuta cuando este termina. Sin el yield, todo el bucle se ejecuta dentro de un solo fotograma y el globo se llena de inmediato. Un bucle while (true) está bien en una corrutina siempre que ceda el control en cada iteración; sin una cesión, nunca devuelve el control del fotograma y el editor de Unity se congela.
Desafío
FácilLa barra espaciadora inicia la corrutina Ride de la Portcullis del castillo. Escribe Ride para que la puerta haga un recorrido completo:
- Se eleva
height(3) unidades aspeed(1.5) unidades por segundo, se detiene exactamente en la parte superior y registraOpen. - Permanece abierta durante 1 segundo.
- Vuelve a bajar a la misma velocidad hasta donde empezó (
down) y registraClosed.
Pulsa Play y luego la barra espaciadora; después, pulsa Check.
Pruébalo tú mismo
using System.Collections;
using UnityEngine;
public class Portcullis : MonoBehaviour
{
public float speed = 1.5f;
public float height = 3f;
Vector3 down;
void Start()
{
down = transform.position;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Ride());
}
}
IEnumerator Ride()
{
// Sube height unidades a una velocidad de speed y registra Open, espera 1 segundo, vuelve a bajar y registra Closed
yield return null;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger