Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Zeige Miras und Toms Gespräch Zeile für Zeile.

  1. Deklariere eine Klasse [System.Serializable] Line mit den öffentlichen Zeichenketten speaker und text, und füge public List<Line> lines; hinzu.
  2. Zeige am Anfang lines[0]: den Sprecher in speakerText, den Text in lineText.
  3. Mit der Leertaste wird die nächste Zeile angezeigt, bis lines.Count erreicht ist. Blende nach der letzten Zeile box aus und protokolliere Dialogue 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

Übe selbstständig: Unity-Playground