Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

La 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 a speed (1.5) unidades por segundo, se detiene exactamente en la parte superior y registra Open.
  • Permanece abierta durante 1 segundo.
  • Vuelve a bajar a la misma velocidad hasta donde empezó (down) y registra Closed.

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;
    }
}
quiz iconPonte a prueba

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