Menu
CoddyTech

Listen von Objekten

Teil des Abschnitts Unity-Scripting: Grundlagen der Unity-Journey von Coddy. Lektion 65 von 85.

Ein Array hat eine feste Länge, die beim Erstellen festgelegt wird. Ein Spawner weiß nicht im Voraus, wie viele Objekte er erstellen wird, deshalb speichert er sie in einer List<T>: einem Array in C#, das wachsen kann. Sie befindet sich in System.Collections.Generic, und T ist der Typ der Elemente, die sie enthält. Dieser Springbrunnen merkt sich jede Münze, die er erstellt:

using System.Collections.Generic;
using UnityEngine;

public class CoinFountain : MonoBehaviour
{
    public GameObject coinPrefab;
    List<GameObject> coins = new List<GameObject>();

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GameObject coin = Instantiate(coinPrefab, transform.position, Quaternion.identity);
            coins.Add(coin);
            Debug.Log(coins.Count + " coins");
        }
    }
}

Add fügt ein Element am Ende hinzu, und Count gibt an, wie viele Elemente enthalten sind; bei einem Array gibt es dafür Length. Das Lesen funktioniert wie bei einem Array: coins[0] ist die erste Münze, und foreach (GameObject c in coins) durchläuft sie alle. coins.Remove(coin) entfernt dieses Element, und coins.RemoveAt(0) entfernt das erste; die Elemente dahinter rücken um eine Stelle nach vorn.

Die Liste selbst muss mit new erstellt werden. Ein Feld, das als List<GameObject> coins; geschrieben ist, enthält null, und das erste Add bricht mit einer NullReferenceException ab.

challenge icon

Aufgabe

Mittel

Lass jeden Klick eine Box zu einer Liste hinzufügen.

  1. Füge using System.Collections.Generic; und das Feld List<GameObject> boxes = new List<GameObject>(); hinzu.
  2. Erzeuge bei einem Klick boxPrefab bei transform.position + new Vector3(boxes.Count * 1.5f, 0, 0), ohne Drehung, und füge es zu boxes hinzu.
  3. Protokolliere "Boxes: " + boxes.Count.

Drücke „Spielen“ und klicke dreimal: Drei Boxen stehen in einer Reihe. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public class BoxStacker : MonoBehaviour
{
    public GameObject boxPrefab;
    // boxes: eine private List<GameObject>

    void Update()
    {
        // Click: Erzeuge eine Box, für jede Box in der Liste 1.5 weiter rechts, füge sie hinzu und protokolliere die Anzahl
    }
}

Alle Lektionen in Unity-Scripting: Grundlagen

Übe selbstständig: Unity-Playground