Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Der 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. Wenn current mindestens cost beträgt, zieht sie cost von current ab und gibt true zurück; andernfalls lässt sie current unverändert und gibt false zurü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 wird Too tired protokolliert.

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;
        }
    }
}
quiz iconTeste dich selbst

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