Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Haz que la trampa de pinchos salte al presionar la barra espaciadora mediante una corrutina.

  1. Escribe IEnumerator Spring(): registra Click, yield return new WaitForSeconds(0.5f); y después transform.position += Vector3.up;.
  2. Después, espera 2 segundos de la misma manera y vuelve a restar Vector3.up.
  3. En el if de la barra espaciadora, inicia la corrutina con StartCoroutine(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

Practica por tu cuenta: Playground de Unity