Loops em corrotinas
Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 25 de 71.
Um loop com um yield return dentro é executado ao longo de vários frames, porque cada iteração pausa antes da próxima. Com WaitForSeconds, o loop repete algo em intervalos regulares. 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 frame até que sua condição seja satisfeita, que é como uma coroutine anima algo. Este balão, com uma escala de 1, cresce 0.5 por segundo até sua escala chegar a 2 e, então, informa:
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 frame, e a linha após o loop só é executada quando o loop termina. Sem o yield, o loop inteiro é executado em um único frame, e o balão fica cheio de uma vez. Um loop while (true) funciona bem em uma coroutine, desde que produza um yield em cada iteração; sem um yield, ele nunca devolve o controle ao frame, e o editor do Unity congela.
Desafio
FácilEscreva Ride para que a grade faça um percurso completo.
- Defina
Vector3 up = down + Vector3.up * height;. Enquantowhile (transform.position != up), mova comVector3.MoveTowards(transform.position, up, speed * Time.deltaTime)eyield return null;. - Registre
Opene, em seguida,yield return new WaitForSeconds(1f);. - Faça o percurso de volta até
downda mesma maneira e, em seguida, registreClosed.
Pressione “Jogar” e a tecla Espaço: o portão sobe, espera e fecha. Depois, clique em “Verificar”.
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 à velocidade speed e registre Open, permaneça por 1 segundo, desça novamente e registre Closed
yield return null;
}
}
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çamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisõ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 ColetarPratique por conta própria: Playground de Unity