Cicli nelle coroutine
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 24 di 63.
Un ciclo con un yield return al suo interno viene eseguito su molti frame, perché ogni iterazione si interrompe prima della successiva. Con WaitForSeconds il ciclo ripete qualcosa a intervalli regolari. Questa sirena lampeggia 3 volte:
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);
}
}Con yield return null il ciclo fa un piccolo passo a ogni frame finché la sua condizione non è soddisfatta: è così che una coroutine anima qualcosa. Questo palloncino, con una scala pari a 1, cresce di 0.5 al secondo finché la sua scala raggiunge 2, poi lo segnala:
IEnumerator Inflate()
{
while (transform.localScale.x < 2f)
{
transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
yield return null;
}
Debug.Log("Full");
}Time.deltaTime funziona qui come in Update(): la coroutine riprende una volta per frame e la riga dopo il ciclo viene eseguita solo quando il ciclo è terminato. Senza yield, l'intero ciclo viene eseguito in un solo frame e il palloncino si gonfia all'istante. Un ciclo while (true) va bene in una coroutine, purché ceda il controllo a ogni iterazione; senza un yield non restituisce mai il controllo al frame e l'editor di Unity si blocca.
Sfida
FacileLa barra spaziatrice avvia la coroutine Ride della Portcullis del castello. Scrivi Ride in modo che il cancello compia un percorso completo:
- Si solleva di
height(3) unità allaspeed(1.5) unità al secondo, si ferma esattamente in cima e registraOpen. - Rimane aperto per 1 secondo.
- Scende alla stessa velocità fino al punto di partenza (
down) e registraClosed.
Premi Play e premi la barra spaziatrice, poi Check.
Provalo tu
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()
{
// Sube height unidades a velocidad speed y registra Open, espera 1 segundo, vuelve a bajar y registra Closed
yield return null;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere