Menu
CoddyTech

Distruggere oggetti

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 52 di 67.

Destroy(obj) rimuove un GameObject dalla scena, compresi i figli. Un secondo argomento ne ritarda la rimozione: Destroy(obj, 2f) lo rimuove tra 2 secondi, mentre lo script che ha chiamato il metodo prosegue subito. Questo cannone spara premendo Space e ogni proiettile che crea scompare 2 secondi dopo:

public GameObject bulletPrefab;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        GameObject bullet = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
        Destroy(bullet, 2f);
    }
}

Passa la copia, non il prefab: Destroy(bulletPrefab) viene rifiutato con Destroying assets is not permitted to avoid data loss. E passa un GameObject quando intendi l'oggetto. All'interno di uno script, gameObject è l'oggetto su cui si trova lo script, quindi Destroy(gameObject) rimuove quell'oggetto, mentre Destroy(this) rimuove solo lo script e lascia l'oggetto al suo posto.

La distruzione non avviene mai sul posto. Unity rimuove l'oggetto alla fine del frame corrente, dopo le chiamate a Update() e LateUpdate() del frame, quindi le righe successive a Destroy vengono comunque eseguite e l'oggetto può ancora essere trovato fino alla fine del frame.

challenge icon

Sfida

Medio

Lo scivolo fa cadere una moneta ogni secondo; questa parte è già scritta. Modificalo in modo che:

  • ogni moneta scompaia 3 secondi dopo essere apparsa, così non ci sono mai più di 3 monete contemporaneamente;
  • la barra spaziatrice distrugga lo scivolo stesso, così non arrivano altre monete. Le monete già uscite continuano a scomparire in tempo.

Premi Play, osserva per qualche secondo, premi la barra spaziatrice, poi Check.

Provalo tu

using UnityEngine;

public class CoinChute : MonoBehaviour
{
    public GameObject coinPrefab;
    public float interval = 1f;
    float timer;

    void Update()
    {
        timer += Time.deltaTime;
        if (timer >= interval)
        {
            Instantiate(coinPrefab, transform.position, Quaternion.identity);
            timer -= interval;
        }

        // Space: distruggi lo scivolo
    }
}
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 Fondamenti di scripting in Unity