Menu
CoddyTech

Sua primeira corrotina

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 24 de 71.

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 cria um método que fornece seus valores um de cada vez; o Unity solicita 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é seu primeiro yield imediatamente, e então Start() continua; o Unity retoma a execução após cada espera, com as variáveis locais como estavam. Um Cycle(); isolado, sem StartCoroutine, não faz nada: ele 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

Faça a armadilha de espinhos saltar com a tecla Espaço usando uma coroutine.

  1. Escreva IEnumerator Spring(): registre Click, yield return new WaitForSeconds(0.5f); e, em seguida, transform.position += Vector3.up;.
  2. Depois, espere 2 segundos da mesma forma e subtraia Vector3.up novamente.
  3. No if da tecla Espaço, inicie-a com StartCoroutine(Spring());.

Pressione “Jogar” e a tecla Espaço: os espinhos saltam para cima e depois descem. Em seguida, clique em “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
}

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

Pratique por conta própria: Playground de Unity