Menu
CoddyTech

Loops em corrotinas

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

Um loop com um yield return dentro é executado ao longo de muitos quadros, porque cada passagem pausa antes da próxima. Com WaitForSeconds, o loop repete algo em um ritmo regular. Esta sirene pisca 3 vezes:

IEnumerator Flash()
{
    for (int i = 0; i < 3; i++)
    {
        lamp.enabled = true;
        yield return new WaitForSeconds(0.2f);
        lamp.enabled = false;
        yield return new WaitForSeconds(0.2f);
    }
}

Com yield return null, o loop faz um pouco a cada quadro até que sua condição seja atendida, que é como uma coroutine anima algo. Este balão, com escala de 1, cresce 0.5 por segundo até que sua escala chegue a 2, e então exibe:

IEnumerator Inflate()
{
    while (transform.localScale.x < 2f)
    {
        transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
        yield return null;
    }
    Debug.Log("Full");
}

Time.deltaTime funciona aqui como em Update(): a coroutine é retomada uma vez por quadro, e a linha após o loop só é executada quando o loop termina. Sem o yield, o loop inteiro é executado em um único quadro, e o balão fica cheio de uma só vez. Um loop while (true) funciona bem em uma coroutine, desde que produza um yield a cada passagem; sem um yield, ele nunca devolve o controle do quadro, e o editor do Unity congela.

challenge icon

Desafio

Fácil

A tecla Espaço inicia a coroutine Ride da Portcullis do castelo. Escreva Ride para que o portão faça um percurso completo:

  • Ele sobe height (3) unidades à speed (1.5) unidades por segundo, para exatamente no topo e registra Open.
  • Ele permanece aberto por 1 segundo.
  • Ele desce de volta à mesma velocidade até onde começou (down) e registra Closed.

Pressione Play e pressione Espaço, depois Check.

Experimente você mesmo

using System.Collections;
using UnityEngine;

public class Portcullis : MonoBehaviour
{
    public float speed = 1.5f;
    public float height = 3f;
    Vector3 down;

    void Start()
    {
        down = transform.position;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Ride());
        }
    }

    IEnumerator Ride()
    {
        // Suba height unidades na velocidade speed e registre Open, permaneça por 1 segundo, desça novamente e registre Closed
        yield return null;
    }
}
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