Menu
CoddyTech

Pulisci

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 78 di 85.

Rimuovere elementi da un elenco mentre un foreach lo attraversa arresta lo script con un’InvalidOperationException. Usa invece un ciclo for all’indietro: rimuovere l’elemento i sposta solo gli elementi che lo seguono, che il ciclo ha già visitato.

for (int i = coins.Count - 1; i >= 0; i--)
{
    if (coins[i].transform.position.y > 20f)
    {
        Destroy(coins[i]);
        coins.RemoveAt(i);
    }
}
challenge icon

Sfida

Medio

Elimina i blocchi che cadono sotto il pavimento.

  1. Sostituisci il foreach con for (int i = blocks.Count - 1; i >= 0; i--), spostando blocks[i] verso il basso come prima.
  2. Dopo lo spostamento, quando blocks[i].transform.position.y < -1f, chiama Destroy(blocks[i]); e poi blocks.RemoveAt(i);.

Premi «Gioca»: la Hierarchy non contiene mai più di qualche blocco. Poi premi «Verifica».

Provalo tu

using System.Collections.Generic;
using UnityEngine;

public class Runner : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    [SerializeField] private float laneEdge = 4f;
    [SerializeField] private GameObject blockPrefab;
    [SerializeField] private float spawnEvery = 1f;
    [SerializeField] private float fallSpeed = 5f;

    private List<GameObject> blocks = new List<GameObject>();
    private float timer;

    void Update()
    {
        Vector3 p = transform.position;
        p.x += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
        p.x = Mathf.Clamp(p.x, -laneEdge, laneEdge);
        transform.position = p;

        timer += Time.deltaTime;
        if (timer >= spawnEvery)
        {
            timer -= spawnEvery;
            Vector3 spot = new Vector3(Random.Range(-laneEdge, laneEdge), 10f, 0f);
            blocks.Add(Instantiate(blockPrefab, spot, Quaternion.identity));
        }

        foreach (GameObject block in blocks)
        {
            block.transform.position += Vector3.down * fallSpeed * Time.deltaTime;
        }
    }
}

Tutte le lezioni di Fondamenti di scripting in Unity

Esercitati da solo: Playground Unity