Menu
CoddyTech

Cicli nelle coroutine

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 25 di 71.

Un ciclo con un yield return al suo interno viene eseguito per molti fotogrammi, 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 esegue una piccola operazione a ogni fotogramma finché la 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 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 fotogramma e la riga dopo il ciclo viene eseguita solo quando il ciclo è terminato. Senza yield, l'intero ciclo viene eseguito in un solo fotogramma e il palloncino si gonfia tutto in una volta. Un ciclo while (true) va bene in una coroutine, purché esegua uno yield a ogni iterazione; senza uno yield non restituisce mai il controllo al fotogramma e l'editor di Unity si blocca.

challenge icon

Sfida

Facile

Scrivi Ride in modo che la saracinesca compia un viaggio completo.

  1. Imposta Vector3 up = down + Vector3.up * height;. Con while (transform.position != up), spostala con Vector3.MoveTowards(transform.position, up, speed * Time.deltaTime) e yield return null;.
  2. Registra Open, poi yield return new WaitForSeconds(1f);.
  3. Falla scendere fino a down allo stesso modo, poi registra Closed.

Premi «Gioca» e premi Spazio: il cancello si alza, attende e si chiude. Poi premi «Verifica».

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()
    {
        // Sali di height unità alla velocità speed e registra Open, resta fermo per 1 secondo, poi scendi e registra Closed
        yield return null;
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity