Tu primera corrutina
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 24 de 71.
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 que contiene 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 después 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, sin que se ejecute ni una sola línea. Y yield return 3f; no espera 3 segundos: Unity solo reconoce objetos de espera como WaitForSeconds y trata cualquier otro valor como un fotograma.
Desafío
FácilHaz que la trampa de pinchos salte al presionar la barra espaciadora mediante una corrutina.
- Escribe
IEnumerator Spring(): registraClick,yield return new WaitForSeconds(0.5f);y despuéstransform.position += Vector3.up;. - Después, espera 2 segundos de la misma manera y vuelve a restar
Vector3.up. - En el
ifde la barra espaciadora, inicia la corrutina conStartCoroutine(Spring());.
Presiona «Jugar» y pulsa la barra espaciadora: los pinchos saltan y después se hunden. Luego, presiona «Comprobar».
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
}
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