Menu
CoddyTech

Cicli nelle coroutine

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 24 di 63.

Un ciclo con un yield return al suo interno viene eseguito su molti frame, 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 fa un piccolo passo a ogni frame finché la sua 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 lo 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 frame e la riga dopo il ciclo viene eseguita solo quando il ciclo è terminato. Senza yield, l'intero ciclo viene eseguito in un solo frame e il palloncino si gonfia all'istante. Un ciclo while (true) va bene in una coroutine, purché ceda il controllo a ogni iterazione; senza un yield non restituisce mai il controllo al frame e l'editor di Unity si blocca.

challenge icon

Sfida

Facile

La barra spaziatrice avvia la coroutine Ride della Portcullis del castello. Scrivi Ride in modo che il cancello compia un percorso completo:

  • Si solleva di height (3) unità alla speed (1.5) unità al secondo, si ferma esattamente in cima e registra Open.
  • Rimane aperto per 1 secondo.
  • Scende alla stessa velocità fino al punto di partenza (down) e registra Closed.

Premi Play e premi la barra spaziatrice, poi Check.

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()
    {
        // Sube height unidades a velocidad speed y registra Open, espera 1 segundo, vuelve a bajar y registra Closed
        yield return null;
    }
}
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