Menu
CoddyTech

Sua primeira corrotina

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 23 de 63.

Update() precisa terminar a cada quadro, então não pode esperar. Uma corrotina pode: é um método que pausa e continua mais tarde, exatamente de onde parou. Ela retorna IEnumerator, que precisa de using System.Collections;, e cada yield return nela é uma pausa. Em C#, yield return faz um método que fornece seus valores um de cada vez; o Unity pede o próximo quando a espera termina. yield return null espera um quadro, e yield return new WaitForSeconds(3f) espera 3 segundos.

StartCoroutine(Cycle()) inicia uma. Este semáforo fica verde, amarelo 3 segundos depois e vermelho após mais um segundo:

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 executa a corrotina até o primeiro yield imediatamente, então Start() continua; o Unity retoma a corrotina após cada espera, com as variáveis locais como estavam. Uma chamada simples a Cycle(); sem StartCoroutine não faz nada: ela cria o método pausado e o descarta, e nenhuma linha dele é executada. E yield return 3f; não é uma espera de 3 segundos: o Unity só reconhece objetos de espera, como WaitForSeconds, e trata qualquer outro valor como um quadro.

challenge icon

Desafio

Fácil

Os Espinhos esperam sob o chão. Faça a tecla Espaço acionar a armadilha com uma corrotina chamada Spring:

  • Imediatamente: registre Click.
  • Meio segundo depois: os espinhos saltam 1 unidade para cima.
  • 2 segundos depois: eles afundam 1 unidade novamente.

Pressione Jogar, pressione Espaço e observe; depois, Verificar.

Experimente você mesmo

using System.Collections;
using UnityEngine;

public class SpikeTrap : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Acione a armadilha com uma corrotina
        }
    }

    // IEnumerator Spring(): Clique, espere 0.5 s, suba 1 unidade, espere 2 s, desça 1 unidade
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Física e jogabilidade