La tua prima coroutine
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 23 di 63.
Update() deve terminare a ogni frame, quindi non può aspettare. Una coroutine può farlo: è un metodo che si mette in pausa e riprende in seguito, esattamente da dove si era fermato. Restituisce IEnumerator, per il quale serve 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 richiede il successivo quando l'attesa è terminata. yield return null attende un frame, mentre yield return new WaitForSeconds(3f) attende 3 secondi.
StartCoroutine(Cycle()) ne avvia una. Questo semaforo diventa verde, 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, con le variabili locali nello stato in cui si trovavano. Una chiamata isolata Cycle(); senza StartCoroutine non fa nulla: crea il metodo in pausa e lo scarta, senza eseguirne nemmeno una riga. E 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
FacileLe Spikes aspettano sotto il pavimento. Premi Spazio per far scattare la trappola con una coroutine chiamata Spring:
- Subito: registra
Click. - Mezzo secondo dopo: le punte saltano su di 1 unità.
- 2 secondi dopo: tornano giù di 1 unità.
Premi Play, premi Spazio e osserva, poi Check.
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(): fai clic, attendi 0.5 s, sali di 1 unità, attendi 2 s, scendi di 1 unità
}
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