Listen im Inspector
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 19 von 64.
Eine Liste von [System.Serializable]-Einträgen ist eine Tabelle, die du im Inspector ausfüllst. Dieser Wachposten läuft 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;
}
}
}Im Inspector werden Stops mit seiner Anzahl und einem Aufklappfeld pro Eintrag angezeigt: 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 andere Stelle der Route ziehen. Der Code liest die Liste wie gewohnt: stops.Count Einträge, stops[current].point, und (current + 1) % stops.Count springt nach dem letzten Haltepunkt zum ersten zurück. Ein Leveldesigner kann einem Wachposten drei Haltepunkte und einem anderen zehn zuweisen, ohne das Skript anzufassen.
Ein Array, public Stop[] stops;, wird auf dieselbe Weise angezeigt. Unitys + kopiert den letzten Eintrag, sodass ein neuer Haltepunkt mit demselben Point und Wait wie der darüber beginnt. Unity zeigt keine Liste von Listen an und speichert sie auch nicht, etwa List<List<Stop>>, ebenso wenig wie ein Dictionary. Verpacke stattdessen die innere Liste in eine [Serializable]-Klasse, zum Beispiel eine Route mit ihrer eigenen List<Stop>, und verwende eine Liste solcher Klassen.
Aufgabe
EinfachZeige Miras und Toms Gespräch Zeile für Zeile.
- Deklariere eine Klasse
[System.Serializable]Linemit den öffentlichen Zeichenkettenspeakerundtext, und fügepublic List<Line> lines;hinzu. - Zeige am Anfang
lines[0]: den Sprecher inspeakerText, den Text inlineText. - Mit der Leertaste wird die nächste Zeile angezeigt, bis
lines.Counterreicht ist. Blende nach der letzten Zeileboxaus und protokolliereDialogue over; danach bewirkt die Leertaste nichts mehr.
Klicke auf „Spielen“ und lies mit der Leertaste weiter. Klicke dann auf „Prüfen“.
Probier es selbst
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
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()
{
// Leertaste: die nächste Zeile oder das Ende des Gesprächs
}
}
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground