Verhaltensbäume :: Aktionen, die länger als einen Tick dauern

19

Nach meinem Verständnis für Verhaltensbäume sollte jedes Verhalten eine kurze, zielorientierte Aktion sein, die in wenigen Iterationen ausgeführt werden kann.

So ist zum Beispiel unten ein Bild eines Verhaltensbaums:

Bildbeschreibung hier eingeben

Nehmen wir nun an, dass das Verhalten von Drive To Enemy mehr als ein paar Iterationen in der Struktur erfordert. Bei jedem Durchgang wird Drive To Enemy aufgerufen, da es sich jetzt im laufenden Zustand befindet.

Das Problem ist, dass ich Evade Enemy anrufen möchte, wenn ein Feind in der Nähe ist. Und wenn man bedenkt, dass Drive To Enemy immer heißt, bekomme ich nie die Chance, Evade Enemy anzurufen ( sollte wahrscheinlich Avoid Enemy heißen ).

  • Soll ich den Tree EACH- Pass durchlaufen, unabhängig davon, welche Aktion gerade ausgeführt wird?
  • Gehe ich das richtig an?
  • Wie gehe ich mit einem solchen Verhalten richtig um?

Ursprünglich auf Stackoverflow gefragt. Ich dachte, hier wäre ein geeigneterer Ort, um diese Frage zu stellen.

Freiberufler
quelle
1
Hilft die hier angegebene Antwort? gamedev.stackexchange.com/questions/51693/…
Tetrad
Das ist auch meine Frage. Ich wollte diese Frage als Kommentar posten, dachte aber, es sollte eine separate Frage sein.
Free Lancer

Antworten:

16

Siehe das Bild, das ich in meiner vorherigen Antwort zur Verfügung gestellt habe :

Bildbeschreibung hier eingeben

Wenn Sie sich vorstellen, dass Knoten 1 "Evade Enemy" und Knoten 2 "Chase Enemy" ist, werden Sie dies auch in der zweiten Iteration sehen (wenn alles grün ist, außer "2" und "B", wenn die zweite Iteration ist) startet), wird 'Evade Enemy' immer noch zuerst überprüft. Erst wenn "Ausweichen" fehlschlägt, weil sich keine Feinde in der Nähe befinden, wird "Verfolgen" erneut aktiviert. Wenn 'Chase Enemy' erneut aufgerufen wird, wird festgestellt, dass es sich im Status 'running' befindet, und es wird direkt zu 'B' gesprungen.

Dies bedeutet, dass der Baum bei jeder Überprüfung immer von links nach rechts verschoben wird. Auch wenn ein Knoten als aktiv markiert ist, werden die Knoten mit der höheren Priorität zuerst überprüft.

Ich bin mir nicht sicher, ob Sie beabsichtigen, Ihre Knoten von rechts nach links zu verarbeiten, aber so scheinen Sie sie angeordnet zu haben (dh unter Ausweichfeind befindet sich der Feind rechts vom Antrieb in entgegengesetzter Richtung). Wenn Sie weitere Erklärungen benötigen, sollten Sie im Chat oder in einer Ihrer bestehenden Fragen zum Thema nachfragen.

MichaelHouse
quelle
2
Vielen Dank für eine weitere gute Erklärung. Es fiel mir schwer, die rekursive Natur von Verhaltensbäumen zu verstehen. Ich wollte Sie im Kommentar zur letzten Frage fragen, wollte die Kommentare aber nicht in eine lange Qualitätssicherung verwandeln. Eine letzte Frage, das alles macht jetzt Sinn. Gibt es einen Unterschied zwischen Selektoren und Sequenzen bei der Behandlung von Betriebszuständen? Es scheint, dass der Selektor (Knoten 0) zuerst Knoten 1 überprüfte, während die Sequenz "Knoten 2" Knoten A bei der zweiten Iteration nicht überprüfte.
Free Lancer
4
Gute Frage, ich glaube du verstehst es. Knoten 2 hat Knoten A nicht überprüft, da Knoten A abgeschlossen wurde. Wenn Knoten 2 als "Wird ausgeführt" markiert ist, wird darauf hingewiesen, dass Knoten B der derzeit ausgeführte Knoten ist. Sie können davon ausgehen, dass ein laufender Knoten bedeutet, dass die vorherigen Knoten nicht erneut überprüft werden müssen.
MichaelHouse
Setzen Sie den Root Selector (0) auf "READY" zurück, nachdem er nach der ersten Iteration auf "RUNNING" gesetzt wurde?
Free Lancer
Ich glaube, dass nur das übergeordnete Element des aktiven Knotens aktiviert ist. Der Root muss bereit sein, anstatt ausgeführt zu werden, da Knoten (1) erneut analysiert werden muss.
MichaelHouse
3
Das ist eine Option. Sie können es tatsächlich so oft oder selten aktualisieren, wie Sie möchten. Alle 300 ms, wenn Sie wollten, oder jeden Frame. Sie können aber auch ein festes und ein ausgelöstes Update haben, um mit Ereignissen umzugehen. Verhaltensbäume sind, wie bei den meisten derartigen Strukturen, nicht streng definiert. Sie sollten so gut wie möglich für Ihr Spiel verwendet werden. Wenn die Auswertung jedes Frames zu verschwenderisch ist, tun Sie das nicht. Sie können auch den Zeitaufwand für die Auswertung eines Baums begrenzen und bei Bedarf mit dem nächsten Frame fortfahren. Es gibt viele Möglichkeiten.
MichaelHouse