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.
Aufgabe
MittelDer Stacker sollte die von ihm erstellten Boxen nachverfolgen:
- Speichere die Boxen in einem privaten Feld vom Typ
List<GameObject>mit dem Namenboxes. - 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 BeispielBoxes: 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
}
}
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
1Dein erstes Skript
Hallo, UnityPlatziere den WürfelBewege dich in jedem FrameDrehe dich jede SekundeSteuere mit den TastenRückblick: Steuere den Würfel4Vektoren
Vektoren addierenRichtungenLokaler und globaler RaumDiagonale GeschwindigkeitAbstand zwischen ObjektenVector3 ist ein StructRückblick: Drohnenpilot7Projekt: Fang den Stern
Der FängerEin fallender Stern10Der Lebenszyklus eines Skripts
Awake und StartUpdate und LateUpdateOnEnable und OnDisableDie Reihenfolge im LebenszyklusRückblick: Lifecycle Logger5Transformationen und Hierarchie
Eltern und KinderSkalierungDinge ansehenAuf einen Punkt zubewegenRückblick: Umlaufender Mond8Dinge finden
Nach Namen findenTagsNach Typ findenReferenzen schlagen FindUnitys NullRückblick: Nächste Münze11Projekt: Weiche den Blöcken aus
Der LäuferFallende Blöcke6GameObjects und Komponenten
Referenzen im InspectorEine Komponente abrufenFehlende KomponentenEine Komponente hinzufügenRequireComponentEin- und AusblendenRückblick: Lichtschalter9Prefabs und Spawnen
Prefabs und InstantiateNach Timer spawnenIn einem Raster spawnenObjektlistenZerstörenZufälliges SpawnenRückblick: Feuerwerk