Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Wenn dein Gameplay wächst, brauchst du irgendwann Objekte, die sich je nachdem, was sie gerade tun, unterschiedlich verhalten. Ein Gegner kann inaktiv, patrouillierend, verfolgend, angreifend, benommen oder tot sein. Eine Tür kann geschlossen, sich öffnend, offen oder verriegelt sein. Ein Bosskampf kann mehrere Phasen durchlaufen.

Hier kommen State Machines ins Spiel.

image.png

Auf dem obigen Bild siehst du den Standardgegner, den Crave für ein neues Projekt erstellt, mit geöffneter State Machine rechts. Wir befinden uns im Zustand „wander“, der innere Zustände hat, wie den „random selector“ (den Anfangszustand, dargestellt durch die grüne Farbe), „go to random“ und „idle“. Du kannst die Übergänge zwischen den Zuständen durch die Pfeile erkennen, und jeder Zustand kann seine eigene Logik haben, entweder in Python, wie im Bild gezeigt, oder in Logic Bricks.

Eine State Machine hilft, Verhalten in klare Zustände zu gliedern, statt ein großes Skript mit unzusammenhängenden Bedingungen zu schreiben.

In dieser Lektion lernst du:

  • Was ein State ist.
  • Was ein Transition ist.
  • Warum hierarchische State Machines nützlich sind.
  • Wie die State Machine Component von Cave in eine Entity passt.
  • Wie On Enter, On Update und On Exit funktionieren.
  • Wie Python und Logic Bricks innerhalb von Zuständen und Übergängen verwendet werden können.

Das Ziel ist es zuerst, das mentale Modell zu verstehen. Sobald das klar ist, wird die Bedienung des Editors viel einfacher.

Was ist ein State?

Ein State beschreibt, was ein Objekt gerade tut.

image.png

Beispielsweise könnte ein Gegner diese Zustände haben:

  • Idle
  • Patrol
  • Chase
  • Attack
  • Dead

Normalerweise sollte jeweils nur einer dieser Zustände den Gegner steuern. Wenn der Gegner in Patrol ist, sollte er nicht gleichzeitig Angriffsverhalten ausführen. Wenn er in Dead ist, sollte er den Spieler nicht weiter verfolgen.

Das macht das Gameplay leichter verständlich, da jeder Zustand eine klare Aufgabe hat.

State Mögliche Aufgabe
Idle Stillstehen und abwarten.
Patrol Zwischen Punkten bewegen.
Chase Auf den Spieler zu bewegen.
Attack Angriffsanimation abspielen und Schaden verursachen.
Dead Bewegung deaktivieren und Todesanimation abspielen.

Statt zu fragen „Was soll der Gegner in diesem Frame tun?“ in einem riesigen Skript, fragt man: „In welchem Zustand befindet sich der Gegner gerade?"

Was ist ein Transition?

Eine Transition ist die Regel, die die State Machine von einem Zustand zum anderen wechselt.

image.png

Beispielsweise:

  • Von Idle zu Patrol, wenn der Gegner anfangen soll, sich zu bewegen, nach einem Timer.
  • Von Patrol zu Chase, wenn der Spieler erkannt wird.
  • Von Chase zu Attack, wenn der Gegner nah genug ist.
  • Von Attack zu Chase, wenn der Angriff fertig ist.
  • Von jedem Zustand zu Dead, wenn die Gesundheit Null erreicht.

Die Transition ist nicht das Verhalten selbst. Sie ist die Entscheidung, „jetzt sollten wir den Zustand wechseln."

Diese Trennung ist wichtig. Der Attack-Zustand konzentriert sich auf den Angriff, während die Transition entscheidet, wann dieser Zustand betreten oder verlassen wird.

Warum hierarchische State Machines helfen

Cave verwendet einen hierarchischen State Machine-Ansatz. Das bedeutet, Zustände können innerhalb anderer Zustände organisiert werden. Das ist nützlich, weil viele Verhaltensweisen eine gemeinsame Oberkategorie teilen.

Beispiel:

Alive
    Idle
    Patrol
    Chase
    Attack
Dead

Die Zustände Idle, Patrol, Chase und Attack gehören alle zum übergeordneten Zustand Alive. Das macht die Struktur leichter verständlich und hilft, gleiche Logik nicht mehrfach zu schreiben.

Für ein Anfängerprojekt kannst du mit einer einfachen flachen State Machine starten. Wenn dein Gameplay aber komplexer wird, hilft die Hierarchie, die Logik sauber zu halten.

Die State Machine Component

Um eine State Machine in einer Szene zu verwenden, benötigt eine Entity eine State Machine Component.

Die Komponente verbindet die Entity mit einem State Machine Asset. Das Asset definiert Zustände, Übergänge und Logik, während die Component diese Logik während des Gameplays auf der Entity ausführt.

Das funktioniert ähnlich wie bei anderen Cave-Systemen:

Asset Component
Python Script Python Component führt es aus.
Animation Animation Component spielt es ab.
State Machine State Machine Component führt es aus.

In der Praxis kann deine Gegner-Entity eine State Machine Component besitzen, die dann die KI-State Machine für den Gegner ausführt.

Ein State Machine Asset kann Eigenschaften besitzen, die du im Eigenschaften-Tab siehst, und diese Eigenschaften können lokal in der State Machine Component geändert werden. So kannst du modulare State Machines mit unterschiedlichen Einstellungen für verschiedene Entity-Typen erstellen.

State Events

Jeder Zustand kann auf drei wichtige Momente reagieren:

Event Wann es ausgeführt wird Übliche Verwendung
On Enter Wenn der Zustand startet. Timer zurücksetzen, Variablen initialisieren, Animation abspielen, Ziel auswählen.
On Update Solange der Zustand aktiv ist. Bewegen, Entfernungen prüfen, Timer aktualisieren.
On Exit Beim Verlassen des Zustands. Effekte stoppen, temporäre Werte löschen.

Beispiel für einen Attack-Zustand:

  • On Enter: Angriffsanimation starten.
  • On Update: Auf den Trefferzeitpunkt oder Callback warten.
  • On Exit: Angriffsflag zurücksetzen.

Das macht jeden Zustand wie ein kleines, eigenständiges Verhalten.

Python innerhalb von Zuständen

State Machines können Python für ihre Logik nutzen.

Innerhalb jedes States wird in Python Code auf nützliche Variablen wie entity und scene zugegriffen, sodass der Zustand die Entity, die die State Machine Component besitzt, steuern kann.

Zum Beispiel könnte ein Zustand beim Eintritt einen Sound abspielen:

cave.playSound("Enemy Alert", volume=0.8)

Oder eine Eigenschaft der Entity lesen:

health = entity.properties.get("health", 100)

So bleibt die Zustand-Logik nah am Verhalten, zu dem sie gehört.

Python innerhalb von Transitions

Auch Transitionen können Python nutzen. Für die Transition-Python-Logik verwendet Cave eine Variable namens result. Wenn result True wird, kann die Transition stattfinden. Eine Transition zum Dead-Zustand könnte etwa so prüfen:

health = entity.properties.get("health", 100)
result = health <= 0

Eine Transition von Chase zu Attack könnte die Distanz prüfen, wenn dein Gegner-Skript oder Eigenschaften diesen Wert liefern:

player = scene.get("Player")
playerPos = player.getTransform().getWorldPosition()
entityPos = entity.getTransform().getWorldPosition()

distanceToPlayer = (playerPos - entityPos).length()
result = distanceToPlayer < 2.0

Die genauen Daten hängen von deinem Spiel ab, aber die Idee bleibt gleich: Die Transition entscheidet, ob es Zeit ist, den Zustand zu wechseln.

TIPP: Während einer Transition stehen dir alle lokalen Variablen des Zustands, aus dem die Transition kommt, zur Verfügung. Im vorherigen Beispiel könntest du also die Spieler-Transform und Entity-Transform in On Enter dieses Zustands abspeichern, um Ressourcen zu sparen, da so nicht jede Frame neu berechnet werden muss.

Logic Bricks in State Machines

State Machines können auch Logic Bricks verwenden.

Das ist praktisch, wenn du Verhalten visuell aufbauen möchtest, statt Python-Code zu schreiben. Für viele Gameplay-Aufgaben sind Logic Bricks eine zugängliche Methode, Events, Bedingungen und Aktionen zu verbinden.

Sie funktionieren genauso wie im Python-Code innerhalb eines Zustands oder einer Transition. Die Logic Bricks für den Zustand und die Transition sind bereits mit den nötigen Bausteinen initialisiert, damit du loslegen kannst.

Du kannst Python und Logic Bricks mischen, je nachdem, was dir für das Verhalten klarer erscheint. Hat ein Zustand oder eine Transition beides, werden beide ausgeführt und die Transition erfolgt, wenn eine von beiden eintritt.

Wann man eine State Machine verwendet

Verwende eine State Machine, wenn ein Objekt klare Verhaltensmodi hat.

Gute Beispiele:

  • Gegner-KI.
  • Bossphasen.
  • Türen und interaktive Objekte.
  • Missions- oder Questablauf.
  • Cutscene-Fortschritt.
  • Zustände von Charakterfähigkeiten.

Für kleine Objekte mit einer einzigen Aktion brauchst du vielleicht keine State Machine. Wenn ein Pickup nur einen Sound abspielt und verschwindet, reicht oft ein kleines Python-Skript oder eine Logic-Brick-Konfiguration.

Was du dir merken solltest

Eine State Machine organisiert Gameplay in Zuständen und Übergängen.

Zustände beschreiben, was gerade passiert. Übergänge entscheiden, wann ein Wechsel erfolgt. On Enter, On Update und On Exit helfen, jeden Zustand fokussiert und lesbar zu halten.

Für einfaches Verhalten reicht oft ein Skript. Für komplexe Verhaltensweisen mit mehreren Modi macht eine State Machine die Logik meist verständlicher und einfacher erweiterbar.