Menu
CoddyTech

Objektlisten

Teil des Abschnitts Grundlagen des Scripting in Unity der Unity-Journey von Coddy. Lektion 51 von 67.

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 von 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 vorhanden 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 darauf folgenden Elemente rücken um einen Platz nach vorne.

Die Liste selbst muss mit new erstellt werden. Ein Feld, das als List<GameObject> coins; geschrieben ist, enthält null, und der erste Aufruf von Add führt zu einer NullReferenceException.

challenge icon

Aufgabe

Mittel

Der Stacker sollte die von ihm erstellten Boxen nachverfolgen:

  • Speichere die Boxen in einem privaten Feld vom Typ List<GameObject> mit dem Namen boxes.
  • Jeder Klick erzeugt eine Box ohne Drehung und fügt sie der Liste hinzu. Eine Box wird an der Position des Stackers plus 1.5 auf der x-Achse für jede Box platziert, die sich bereits in der Liste befindet: die erste beim Stacker, die nächste 1.5 rechts davon und so weiter.
  • Mit der Leertaste wird die neueste Box zurückgenommen: Blende sie mit SetActive(false) aus und entferne sie aus der Liste. Wenn keine Boxen vorhanden sind, bewirkt die Leertaste nichts.
  • Protokolliere nach jeder Änderung der Liste Boxes: und die Anzahl, zum Beispiel Boxes: 3.

Drücke Play, klicke und drücke die Leertaste, dann Check.

Probier es selbst

using UnityEngine;

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

    void Update()
    {
        // Klick: Erzeuge eine Box, für jede Box in der Liste um 1.5 weiter rechts, und füge sie der Liste hinzu
        // Leertaste: Blende die neueste Box aus und entferne sie aus der Liste
        // Protokolliere nach jeder Änderung "Boxes: " und die Anzahl
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen des Scripting in Unity