Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Fai scattare la trappola a punte premendo Spazio, usando una coroutine.

  1. Scrivi IEnumerator Spring(): registra Click, yield return new WaitForSeconds(0.5f);, poi transform.position += Vector3.up;.
  2. Poi attendi 2 secondi allo stesso modo e sottrai di nuovo Vector3.up.
  3. Nell’if di Spazio, avviala con StartCoroutine(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

Esercitati da solo: Playground Unity