Listen im Inspector
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 16 von 50.
Eine Liste von [System.Serializable]-Einträgen ist eine Tabelle, die du im Inspector ausfüllst. Dieser Wächter geht eine Route mit Haltepunkten ab und wartet an jedem so lange, wie es in seinem Eintrag steht:
[System.Serializable]
public class Stop
{
public Transform point;
public float wait = 1f;
}
public class Patrol : MonoBehaviour
{
public float speed = 3f;
public List<Stop> stops;
private int current;
private float waited;
void Update()
{
Stop stop = stops[current];
transform.position = Vector3.MoveTowards(transform.position, stop.point.position, speed * Time.deltaTime);
if (transform.position != stop.point.position) return;
waited += Time.deltaTime;
if (waited >= stop.wait)
{
waited = 0f;
current = (current + 1) % stops.Count;
}
}
}Der Inspector zeigt Stops mit seiner Anzahl und einem Aufklappfeld pro Eintrag: Element 0, Element 1 und so weiter, jeweils mit einem Point und einem Wait. Die Schaltfläche + fügt einen Eintrag hinzu, die Schaltfläche − entfernt den ausgewählten Eintrag und mit dem Griff links neben einer Zeile kannst du sie an eine neue Stelle in der Route ziehen. Der Code liest die Liste wie gewohnt: stops.Count Einträge, stops[current].point und (current + 1) % stops.Count führt nach dem letzten Halt zurück zum ersten. Ein Leveldesigner kann einem Wächter drei Haltepunkte und einem anderen zehn geben, ohne das Skript anzufassen.
Ein Array, public Stop[] stops;, wird genauso angezeigt. Unitys + kopiert den letzten Eintrag, sodass ein neuer Halt mit demselben Point und Wait wie der darüber beginnt. Unity zeigt eine Liste von Listen wie List<List<Stop>> oder ein Dictionary weder an noch speichert es sie. Verpacke stattdessen die innere Liste in eine [Serializable]-Klasse, zum Beispiel Route mit einer eigenen List<Stop>, und verwende eine Liste solcher Klassen.
Aufgabe
EinfachMira und Tom sitzen an einer kaputten Brücke fest. Schreibe das Dialogfeld in Dialogue.cs auf dem HUD. Die Szene verknüpft box, speakerText und lineText und hat das Gespräch bereits für eine Liste namens lines vorbereitet.
- Deklariere eine Klasse
Linemit zwei öffentlichen Zeichenfolgen,speakerundtext, die der Inspector anzeigen kann, und gib Dialogue eine öffentlicheList<Line>namenslines. - Zu Beginn zeigt das Feld die erste Zeile: den Sprecher in
speakerTextund den Text inlineText. - Mit jedem Druck auf die Leertaste wird die nächste Zeile angezeigt. Ein Gespräch kann beliebig viele Zeilen haben, orientiere dich also an der Anzahl der Einträge in der Liste.
- Wird in der letzten Zeile die Leertaste gedrückt, wird das Feld ausgeblendet und
Dialogue overprotokolliert. Danach bewirkt die Leertaste nichts mehr.
Drücke Spielen, lies das Gespräch mit der Leertaste und klicke dann auf Prüfen.
Probier es selbst
using UnityEngine;
using TMPro;
public class Dialogue : MonoBehaviour
{
public GameObject box;
public TMP_Text speakerText;
public TMP_Text lineText;
void Start()
{
// die erste Zeile anzeigen
}
void Update()
{
// Space: die nächste Zeile oder das Ende des Gesprächs
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest