Menu
CoddyTech

Limpeza

Parte da seção Fundamentos de Scripting no Unity do Journey de Unity da Coddy. Lição 78 de 85.

Remover itens de uma lista enquanto um foreach percorre essa lista interrompe o script com uma InvalidOperationException. Em vez disso, percorra a lista de trás para frente com for: remover o item i move apenas os itens que vêm depois dele, que o loop já visitou.

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

Desafio

Médio

Remova os blocos que caem para baixo do chão.

  1. Substitua o foreach por for (int i = blocks.Count - 1; i >= 0; i--), movendo blocks[i] para baixo como antes.
  2. Depois de mover, quando blocks[i].transform.position.y < -1f, chame Destroy(blocks[i]); e depois blocks.RemoveAt(i);.

Pressione “Jogar”: a Hierarchy nunca contém mais do que alguns blocos. Em seguida, clique em “Verificar”.

Experimente você mesmo

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 as lições de Fundamentos de Scripting no Unity

Pratique por conta própria: Playground de Unity