Zusammenwirkende Komponenten
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 4 von 64.
Kleine Komponenten brauchen einander trotzdem. Ein Jetpack benötigt Fuel auf demselben Objekt. Deshalb sucht es Fuel einmal in Awake, speichert es in einem Feld und kommuniziert über zwei kleine öffentliche Methoden damit:
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, wenn 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. Awake ist der richtige Ort, um die Komponente abzurufen: Die Methode wird einmal ausgeführt, und bis dahin sind alle Komponenten des Objekts vorhanden.
Das Jetpack ändert amount niemals selbst. Fuel legt fest, was Verbrennen bedeutet, zum Beispiel, dass der Wert nie unter 0 sinkt, und das Jetpack fragt lediglich danach. Wenn Fuel später eine Anzeige enthält oder durch aufgesammelte Objekte wieder aufgefüllt wird, muss das Jetpack nicht geändert werden.
Aufgabe
EinfachLass den Dash des Skaters Ausdauer kosten.
- Füge in
Staminapublic bool TrySpend(float cost)hinzu: Wenncurrentmindestenscostbeträgt, ziehe den Betrag ab und gibtruezurück, andernfallsfalse. - Setze
[RequireComponent(typeof(Stamina))]überpublic class Dashund hole die Komponente inAwake()in ein Feld. - Bei Leertaste: Führe den Dash nur aus, wenn
TrySpend(cost)true ist; andernfalls gibToo tiredim Protokoll aus.
Drücke „Spielen“: Nach zwei Dashes steht in der Console Too tired. Dann „Prüfen“.
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;
}
}
}
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