Komponenten im Zusammenspiel
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 4 von 50.
Kleine Komponenten brauchen trotzdem einander. Ein Jetpack benötigt Fuel auf demselben Objekt. Daher findet es Fuel einmal in Awake, speichert es in einem Feld und greift über zwei kleine öffentliche Methoden darauf zu:
public class Fuel : MonoBehaviour
{
public float amount = 10f;
public bool IsEmpty()
{
return amount <= 0f;
}
public void Burn(float units)
{
amount = Mathf.Max(amount - units, 0f);
}
}[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
public float lift = 4f;
private Fuel fuel;
void Awake()
{
fuel = GetComponent<Fuel>();
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
{
fuel.Burn(Time.deltaTime);
transform.position += Vector3.up * lift * Time.deltaTime;
}
}
}[RequireComponent(typeof(Fuel))] sorgt dafür, dass Unity Fuel hinzufügt, sobald ein Jetpack hinzugefügt wird – im Editor oder mit AddComponent – und verhindert, dass Fuel entfernt wird, solange das Jetpack vorhanden ist. Unity prüft dies nur beim Hinzufügen des Jetpacks. Ein Jetpack, das bereits auf einem Objekt war, bevor du das Attribut geschrieben hast, behält also seine bisherige Konfiguration. In Awake solltest du Fuel abrufen: Die Methode wird einmal ausgeführt, und bis dahin sind alle Komponenten des Objekts vorhanden.
Das Jetpack ändert amount nie selbst. Fuel legt fest, was Verbrennen bedeutet, zum Beispiel, dass der Wert nie unter 0 fällt, und das Jetpack fragt lediglich danach. Wenn Fuel später eine Anzeige bereitstellt oder durch eingesammelte Gegenstände aufgefüllt wird, muss das Jetpack nicht geändert werden.
Aufgabe
EinfachDer Dash der Skaterin ist kostenlos: Mit der Leertaste schießt sie so oft, wie du sie drückst, 3 Einheiten nach vorn (+z). Sorge dafür, dass er Ausdauer kostet. Mit den Pfeiltasten steuerst du sie (Mover.cs, fertig), und Stamina.cs füllt current bereits um regen pro Sekunde bis auf max (100) wieder auf.
- Füge in Stamina eine öffentliche Methode
bool TrySpend(float cost)hinzu. Wenncurrentmindestenscostbeträgt, zieht siecostvoncurrentab und gibttruezurück; andernfalls lässt siecurrentunverändert und gibtfalsezurück. - Sorge dafür, dass Dash an seinem Objekt eine Stamina benötigt, damit Unity immer eine hinzufügt, wenn Dash hinzugefügt wird. Hole sie einmal in Awake und speichere sie in einem Feld.
- Ein Dash kostet
cost(im Inspector wird der Wert auf 40 gesetzt). Mit der Leertaste dashst du nur, wenn TrySpend zustimmt; andernfalls wirdToo tiredprotokolliert.
Drücke Play und dash, bis sie zu erschöpft ist, und klicke dann auf Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
public class Dash : MonoBehaviour
{
public float distance = 3f;
public float cost = 40f;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
transform.position += Vector3.forward * distance;
}
}
}
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