Cicli nelle coroutine
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 25 di 71.
Un ciclo con un yield return al suo interno viene eseguito per molti fotogrammi, 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 esegue una piccola operazione a ogni fotogramma finché la 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 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 fotogramma e la riga dopo il ciclo viene eseguita solo quando il ciclo è terminato. Senza yield, l'intero ciclo viene eseguito in un solo fotogramma e il palloncino si gonfia tutto in una volta. Un ciclo while (true) va bene in una coroutine, purché esegua uno yield a ogni iterazione; senza uno yield non restituisce mai il controllo al fotogramma e l'editor di Unity si blocca.
Sfida
FacileScrivi Ride in modo che la saracinesca compia un viaggio completo.
- Imposta
Vector3 up = down + Vector3.up * height;. Conwhile (transform.position != up), spostala conVector3.MoveTowards(transform.position, up, speed * Time.deltaTime)eyield return null;. - Registra
Open, poiyield return new WaitForSeconds(1f);. - Falla scendere fino a
downallo stesso modo, poi registraClosed.
Premi «Gioca» e premi Spazio: il cancello si alza, attende e si chiude. Poi premi «Verifica».
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()
{
// Sali di height unità alla velocità speed e registra Open, resta fermo per 1 secondo, poi scendi e registra Closed
yield return null;
}
}
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 rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliereEsercitati da solo: Playground Unity