Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Lass den Dash des Skaters Ausdauer kosten.

  1. Füge in Stamina public bool TrySpend(float cost) hinzu: Wenn current mindestens cost beträgt, ziehe den Betrag ab und gib true zurück, andernfalls false.
  2. Setze [RequireComponent(typeof(Stamina))] über public class Dash und hole die Komponente in Awake() in ein Feld.
  3. Bei Leertaste: Führe den Dash nur aus, wenn TrySpend(cost) true ist; andernfalls gib Too tired im 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

Übe selbstständig: Unity-Playground