Menu
CoddyTech

Limpieza

Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 78 de 85.

Quitar elementos de una lista mientras un foreach la recorre detiene el script con una InvalidOperationException. En su lugar, recorre la lista hacia atrás con for: al quitar el elemento i, solo se desplazan los elementos que están después, que el bucle ya ha visitado.

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

Desafío

Intermedio

Elimina los bloques que caen por debajo del suelo.

  1. Sustituye foreach por for (int i = blocks.Count - 1; i >= 0; i--) y mueve blocks[i] hacia abajo como antes.
  2. Después del movimiento, cuando blocks[i].transform.position.y < -1f, llama a Destroy(blocks[i]); y luego a blocks.RemoveAt(i);.

Pulsa «Jugar»: la jerarquía nunca contiene más que unos pocos bloques. Después, pulsa «Comprobar».

Pruébalo tú mismo

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;
        }
    }
}

Todas las lecciones de Fundamentos de scripting en Unity

Practica por tu cuenta: Playground de Unity