Bucles en corrutinas
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 25 de 71.
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, muestra:
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í igual que en Update(): la corrutina se reanuda una vez por fotograma, y la línea posterior al bucle solo se ejecuta cuando el bucle termina. Sin yield, todo el bucle se ejecuta en 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ácilEscribe Ride para que la verja haga un recorrido completo.
- Establece
Vector3 up = down + Vector3.up * height;. Mientraswhile (transform.position != up), muévela conVector3.MoveTowards(transform.position, up, speed * Time.deltaTime)yyield return null;. - Registra
Openy despuésyield return new WaitForSeconds(1f);. - Haz que baje hasta
downde la misma manera y, después, registraClosed.
Pulsa «Jugar» y presiona la barra espaciadora: la verja sube, espera y se cierra. Después, pulsa «Comprobar».
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 velocidad speed y registra Open, permanece 1 segundo, vuelve a bajar y registra Closed
yield return null;
}
}
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 regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity