Tu primera corrutina
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 23 de 63.
Update() debe terminar en cada fotograma, así que no puede esperar. Una corutina sí puede: es un método que se pausa y continúa más tarde, justo donde se detuvo. Devuelve IEnumerator, que requiere using System.Collections;, y cada yield return dentro de ella es una pausa. En C#, yield return crea un método que entrega sus valores de uno en uno; Unity solicita el siguiente cuando termina la espera. yield return null espera un fotograma, y yield return new WaitForSeconds(3f) espera 3 segundos.
StartCoroutine(Cycle()) inicia una. Este semáforo se pone verde, amarillo 3 segundos después y rojo tras un segundo más:
using System.Collections;
using UnityEngine;
public class TrafficLight : MonoBehaviour
{
Renderer lamp;
void Start()
{
lamp = GetComponent<Renderer>();
StartCoroutine(Cycle());
}
IEnumerator Cycle()
{
lamp.material.color = Color.green;
yield return new WaitForSeconds(3f);
lamp.material.color = Color.yellow;
yield return new WaitForSeconds(1f);
lamp.material.color = Color.red;
}
}StartCoroutine ejecuta la corutina hasta su primer yield de inmediato, y luego Start() continúa; Unity la reanuda después de cada espera, con sus variables locales tal como estaban. Una llamada aislada a Cycle(); sin StartCoroutine no hace nada: crea el método pausado y lo descarta, y no se ejecuta ni una línea. Y yield return 3f; no es una espera de 3 segundos: Unity solo reconoce objetos de espera como WaitForSeconds y trata cualquier otro valor como un fotograma.
Desafío
FácilLos Spikes esperan debajo del suelo. Haz que Space active la trampa con una corrutina llamada Spring:
- De inmediato: registra
Click. - Medio segundo después: los pinchos saltan 1 unidad hacia arriba.
- 2 segundos después: vuelven a bajar 1 unidad.
Presiona Play, presiona Space y observa; después, Check.
Pruébalo tú mismo
using System.Collections;
using UnityEngine;
public class SpikeTrap : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Activa la trampa con una corrutina
}
}
// IEnumerator Spring(): Haz clic, espera 0.5 s, sube 1 unidad, espera 2 s, baja 1 unidad
}
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