La tua prima coroutine
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 24 di 71.
Update() deve terminare a ogni frame, quindi non può aspettare. Una coroutine può farlo: è un metodo che si sospende e riprende più tardi, esattamente da dove si era fermato. Restituisce IEnumerator, che richiede using System.Collections;, e ogni yield return al suo interno è una pausa. In C#, yield return crea un metodo che fornisce i suoi valori uno alla volta; Unity chiede il successivo quando l’attesa è finita. yield return null attende un frame, mentre yield return new WaitForSeconds(3f) attende 3 secondi.
StartCoroutine(Cycle()) ne avvia una. Questo semaforo diventa verde, poi giallo 3 secondi dopo e rosso dopo un altro secondo:
using System.Collections;
using UnityEngine;
public class TrafficLight : MonoBehaviour
{
Renderer lamp;
void Start()
{
lamp = GetComponent<Renderer>();
StartCoroutine(Cycle());
}
IEnumerator Cycle()
{
lamp.material.color = Color.green;
yield return new WaitForSeconds(3f);
lamp.material.color = Color.yellow;
yield return new WaitForSeconds(1f);
lamp.material.color = Color.red;
}
}StartCoroutine esegue subito la coroutine fino al suo primo yield, poi Start() prosegue; Unity la riprende dopo ogni attesa, mantenendo inalterate le variabili locali. Un semplice Cycle(); senza StartCoroutine non fa nulla: crea il metodo sospeso e lo scarta, senza eseguirne nemmeno una riga. Inoltre, yield return 3f; non è un’attesa di 3 secondi: Unity riconosce solo oggetti di attesa come WaitForSeconds e tratta qualsiasi altro valore come un frame.
Sfida
FacileFai scattare la trappola a punte premendo Spazio, usando una coroutine.
- Scrivi
IEnumerator Spring(): registraClick,yield return new WaitForSeconds(0.5f);, poitransform.position += Vector3.up;. - Poi attendi 2 secondi allo stesso modo e sottrai di nuovo
Vector3.up. - Nell’
ifdi Spazio, avviala conStartCoroutine(Spring());.
Premi «Gioca» e premi Spazio: le punte saltano in alto, poi si abbassano. Poi premi «Verifica».
Provalo tu
using System.Collections;
using UnityEngine;
public class SpikeTrap : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Attiva la trappola con una coroutine
}
}
// IEnumerator Spring(): clic, attendi 0.5 s, sali di 1 unità, attendi 2 s, scendi di 1 unità
}
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