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.
Desafio
FácilA 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 registraOpen. - Ele permanece aberto por 1 segundo.
- Ele desce de volta à mesma velocidade até onde começou (
down) e registraClosed.
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;
}
}
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar