Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Le 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à
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay