Verhaltensbaum

Hinweis: Dies ist ein reines Skript-System. Sie benötigen mindestens Grundkenntnisse in der Funktionsweise von Skripten und C# in Unity, um zu verstehen, wie es funktioniert und wie man es verwendet.

Wie der Name schon sagt, sind Verhaltensbäume eine Möglichkeit, das Verhalten mit einem Baum von Aktionen zu kodieren. Sie werden im Game Kit verwendet, um das Verhalten der KI für Feinde und die Boss-Kampfsequenz zu kontrollieren.

Ein visuelles Beispiel für einen Verhaltensbaum:

Theorie

Bei jedem Update des Spiels wird der Baum " angeklickt ", d.h. er durchläuft jeden Kindknoten der Wurzel, geht weiter nach unten, wenn dieser Knoten Kinder hat, etc.

Jeder Knoten hat zugehörige Aktionen und gibt einen von drei Zuständen an seinen übergeordneten Knoten zurück:

  • Erfolg (Success): Der Knoten hat seine Aufgabe erfolgreich abgeschlossen.
  • Fehler (Failure): Der Knoten hat die Aufgabe nicht bestanden.
  • Weiter (Continue): Der Knoten hat die Aufgabe noch nicht beendet.

Der zurückgegebene Zustand wird von jedem übergeordneten Knoten unterschiedlich verwendet.

Zum Beispiel:

  • Der Selektor aktiviert das nächste Kind, wenn das aktuelle Fehler oder Erfolg zurückgibt, und hält das aktuelle Kind aktiv, wenn es Weiter zurückgibt.
  • Testknoten rufen ihre Unterknoten auf und geben den Unterzustand zurück, wenn der Test wahr ist, oder geben Fehler zurück, ohne ihre Unterknoten aufzurufen, wenn der Test falsch ist.

Game Kit Implementierung

Die Art und Weise, wie Verhaltensbäume im Game-Kit verwendet werden, ist durch ein Skript. Hier ist ein Beispiel für einen sehr einfachen Verhaltensbaum:

Zuerst müssen wir oben in der Datei using BTAI hinzufügen .

Root aiRoot = BT.Root();

aiRoot.Do(

BT.If(TestVisibleTarget).Do(

BT.Call(Aim),

BT.Call(Shoot)

),

BT.Sequence().Do(

BT.Call(Walk),

BT.Wait(5.0f),

BT.Call(Turn),

BT.Wait(1.0f),

BT.Call(Turn)

)

);

aiRoot sollte in der Klasse als Member gespeichert werden, da Sie aiRoot.Tick() in der Update-Funktion aufrufen müssen, damit Baumaktionen ausgeführt werden können.

Lassen Sie uns durchgehen, wie das Update in der aiRoot.Tick() funktioniert:

  • Zuerst testen wir, ob die Funktion TestVisibleTarget true zurückgibt. Wenn dies der Fall ist, führt es die Kinder aus, die die Funktionen Ziel (Aim) und Schießen (Shoot) aufrufen.
  • Wenn der Test false zurückgibt, gibt der If-Knoten Fehler zurück und die Wurzel geht dann zum nächsten Kind. Dies ist eine Sequenz, die mit der Ausführung ihres ersten Untergeordneten beginnt.
    • - Dies ruft die Funktion Laufen (Walk) auf. Es gibt Erfolg zurück, so dass die Sequenz das nächste Kind als aktiv setzt und ausführt
    • - Der Knoten Warten (Wait) wird ausgeführt. Da es 5 Sekunden warten muss und gerade zum ersten Mal aufgerufen wurde, hat es die Wartezeit nicht erreicht, also gibt es Weiter zurück.
    • - Da die Sequenz von ihrem aktiven Kind einen Weiter-Status erhält, ändert sie das aktive Kind nicht, so dass sie beim nächsten Update von diesem Kind an beginnt.
  • Sobald der Warten (Wait)-Knoten so aktualisiert wurde, dass er seinen Timer erreicht hat, gibt er Erfolg zurück, so dass die Sequenz zum nächsten Kind geht.

Liste der Knoten

Sequenz

Unterknoten werden nacheinander ausgeführt. Wenn ein Kind folgendes zurückgibt:

  • Erfolg (Success): Die Sequenz markiert das nächste Kind im nächsten Frame.
  • Fehler (Failure): Die Sequenz kehrt beim nächsten Bild zum ersten Kind zurück.
  • Weiter (Continue): Die Sequenz ruft diesen Knoten im nächsten Frame erneut auf.>

RandomSequence

Wenn ein beliebiges Kind aus seiner Liste aufgerufen wird, wird es jedes Mal ausgeführt. Sie können eine Liste von Gewichtungen angeben, die auf jedes Kind als int-Array im Konstruktor angewendet werden sollen, um die Wahrscheinlichkeit zu erhöhen, dass einige Kinder ausgewählt werden.

Selector

Führt alle Kinder in der Reihenfolge aus, bis einer von ihnen Erfolg hat, und beendet sie dann, ohne die restlichen Kinderknoten auszuführen. Wenn keiner Erfolg zurückgibt, dann gibt dieser Knoten Fehler zurück.

Call

Ruft die angegebene Funktion auf, die immer Erfolg zurückgibt.

If

Ruft die angegebene Funktion auf.

  • Wenn es true zurückgibt, ruft es das aktuell aktive Kind auf und gibt seinen Status zurück.
  • Andernfalls gibt es Fehler zurück, ohne seine Kinder anzurufen.

While

Meldet Weiter, solange die angegebene Funktion true zurückgibt (so dass der nächste Frame, wenn der Baum angekreuzt ist, wieder von diesem Knoten beginnt, ohne alle vorherigen Knoten auszuwerten).

Kinder werden nacheinander ausgeführt.

Liefert Fehler, wenn die Funktion false zurückgibt und die Schleife unterbrochen ist.

Condition

Dieser Knoten gibt Erfolg zurück, wenn die angegebene Funktion true und Fehler, wenn false zurückgibt.

Nützlich bei der Verkettung mit anderen Knoten, die vom Ergebnis ihrer Kinder abhängen (z.B. Sequenz, Selektor.).

Repeat

Führt alle Unterknoten nacheinander eine bestimmte Anzahl von Mal aus.

Meldet Weiter bis zum Erreichen der Zählung, wo es Erfolg zurückgibt.

Wait

Meldet Weiter, bis die angegebene Zeit erreicht ist (beginnend mit dem ersten Aufruf), wo sie dann Erfolg zurückgibt.

Trigger

Ermöglicht das Setzen eines Triggers (oder das Zurücksetzen eines Triggers, wenn das letzte Argument auf false gesetzt ist) im angegebenen Animator. Gibt immer Erfolg zurück.

SetBool

Ermöglicht das Setzen des Wertes eines booleschen Parameters im angegebenen Animator. Liefert immer Erfolg

SetActive

Setzt ein bestimmtes Spielobjekt aktiv/inaktiv. Gibt immer Erfolg zurück.

Spielplatz

Erste Schritte
  1. Einführung in das Game Kit
  2. Erstellen einer neuen Szene
  3. Levelerstellung
  4. Testen eines Levels
  5. Hinzufügen einer beweglichen Plattform
  6. Öffnen einer Tür durch ein Ereignis
  7. Feinde
  8. Beschädigung durch Objekte
  9. Dekorieren
  10. Teleportieren des Spielers
  11. Spaß haben
Erste Schritte mit dem 2D-Spielkit
  1. Überblick und Ziele
  2. Ellen und das Setzen von Gefahren
  3. Hinzufügen von beweglichen Plattformen
  4. Türen und zerstörbare Objekte
  5. Feinde hinzufügen und ausmerzen
  6. Steuerung von Plattformen mit Schaltern
  7. Verwendung des Inventarsystems
  8. Teleporting und Dialogfelder
Referenzhandbuch für das Spiel-Kit
  1. Wie man dieses Dokument verwendet
  2. Ellen
  3. Feindliches Verhalten
  4. Gesundheitsförderung
  5. Drucksensor
  6. Schadenssystem
  7. Bewegliche Plattform
  8. Interaktionssystem
  9. Inventarsystem
  10. HubDoor
  11. Feindauftauchen
Erweiterte Game Kit Themen
  1. Fortgeschrittene Themen
  2. Zufalls-Audio-Player
  3. VFXController
  4. Datenbestandsdauer
  5. SceneLinkedSMB
  6. Objektpooling im Gamekit
  7. Verhaltensbaum