Ich implementiere einen NPC, um in einem virtuellen Raum herumzulaufen, insbesondere in einer Katze. Ich habe eine Reihe von kurzen Animationsclips (3-5 Sekunden). Mein erster Instinkt war nur, eine zufällige Animation auszuwählen, als die letzte endete, aber ich erkannte, dass sie nicht realistisch aussehen würde, da sie das Verhalten zu oft ändern würde, selbst wenn die nächste Animation auf physisch bedingte Möglichkeiten beschränkt ist.
Meine beabsichtigte Lösung ist so etwas wie ein Verhaltensbaum ( http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php ), in dem jede Animation eine gewichtete Liste der nächsten Animationen enthält. Das heißt, wenn die Katze läuft, hat sie eine 80% ige Chance, weiterzulaufen, 20% im Sitzen, 0% im Schlaf. Grundsätzlich wird ein Markov-Modell verwendet, um den entsprechenden nächsten Schritt zu erhalten.
Ich habe jedoch keine Ahnung, ob dies eine gute Lösung ist, und ich weiß auch nicht, wie ich das Mapping von der aktuellen Animation zur potenziellen nächsten Animation + Wahrscheinlichkeit generieren werde. 30 Animationen * 30 nächste Animationen = 900 Gewichtungen. Das ist viel manuell zu berechnen.
Die Katze reagiert manchmal, wenn sie auf ein Hindernis stößt, aber die Hauptlast des Problems besteht darin, eine realistische Folge von Animationen auszuwählen, ohne sie alle im Voraus auszuwählen. Im Baum gibt es auch einige andere Eingaben, wie die Nähe zu einer Person, den Ort im Raum, die Zeit seit dem letzten Essen usw.
Antworten:
Im Allgemeinen müssen Sie die Logik Ihrer Katze von den Animationen trennen.
Jetzt müssen Sie zuerst die Katzenlogik schreiben. Ein guter Ansatz, den ich gefunden habe, besteht darin, die Logik in Ebenen aufzuteilen.
Bedürfnisse
Katze kann einen Zustand mit einigen Motiven / Bedürfnissen (Essen, Schlafen usw.) haben, die im Laufe der Zeit langsam wachsen und sich dabei verringern (denken Sie an Sims). Wenn Sie möchten, können Sie mithilfe der Fuzzy-Logik die aktuelle Aufgabe auswählen, die den größten Bedarf erfüllt.
Aufgaben
Jetzt hat die Katze zu jedem Zeitpunkt eine Aufgabe (Futter finden, Bett zum Schlafen finden, Platz zum Herumlaufen usw. Es ist auch eine Aufgabe, untätig zu sein). Diese Aufgaben sagen der Katze, wohin sie gehen möchte und was sie tun möchte.
Aktionen
Jetzt gibt es die 3. Ebene - Aktionen. Jedes Ziel hat eine Reihe von Aktionen zu erledigen (aufstehen, gehen, sich ducken, essen usw.). Jede Aktion ist für ihre Ausführung verantwortlich. Zum Beispiel sollte die Gehaktion nach Hindernissen suchen und die Katze von Punkt A nach Punkt B bringen, möglicherweise Unteraktionen enthalten und ausführen (über Hindernisse springen, unter Möbeln hocken usw.).
Animationen
Wenn die Katze nun Bedürfnisse, eine Aufgabe und eine Aktion hat, können Sie die richtige Animation für diese Aktion auswählen. Wenn Sie die aktuelle und nächste Animation kennen, sollten Sie in der Lage sein, von einer zur anderen zu wechseln. Wenn die Aufgabe beispielsweise besagt, dass die Katze nach dem Gehen zu ihrem Kissen liegen soll, werden die Animationen in die Warteschlange gestellt - Walk-Stop-Sit-Lay.
Das Einreihen von Animationen kann effektiv erfolgen, wenn Sie sie als Knoten in ein Diagramm abbilden und die Knoten zwischen übertragbaren Animationen verbinden (z. B. ist Gehen zum Sitzen möglich, aber Springen zum Kauen - nicht). Anschließend können Sie mithilfe von A * in diesem Diagramm Animationen von einer zur anderen in die Warteschlange stellen.
Beispiel: Katze muss sich ausruhen und fressen. Lassen Sie die Aufgabe "Ausruhen" einen Platz zum Ausruhen finden, gehen Sie mit der Katze dorthin, legen Sie sie hin und ruhen Sie sich aus. Lassen Sie die Aufgabe "Ruhe" ab und zu auf Bedingungen prüfen, wenn die Umgebung unangenehm wird. Lassen Sie die Aufgabe enden. Überprüfen Sie, was die Katze jetzt mehr will, wenn sie sich noch ausruhen will - wiederholen Sie den vorherigen Teil. Wenn die Katze ausgeruht ist - wählen Sie eine neue Aufgabe.
quelle
Ich denke, was Sie suchen, ist die Finite-State-Maschine oder FSM. Kurz gesagt, es ist eine Möglichkeit, das Verhalten von NPCs entsprechend ihrem aktuellen Status zu ändern.
BEARBEITEN:
Es ist wie ein Verhaltensbaum, aber auf einige Gruppen "Zustände" reduziert, zu denen der NPC zurückkehrt. Ein Verhaltensbaum ermöglicht eine viel größere Flexibilität des Verhaltens, benötigt jedoch auch mehr Daten für die Gewichtung von Wahrscheinlichkeiten (eine clevere Möglichkeit, dies zu automatisieren, sind Tags, wie Scriptin in seiner Antwort vorschlägt). Wenn Sie Zustände verwenden, legen Sie eine Reihe von Aktionen und Wahrscheinlichkeiten für diese Aktionen im Zustand fest. Um die aktuelle Aktion tatsächlich zu ändern, kann sie mit möglicherweise 80% verzerrt werden, um dieselbe Aktion beizubehalten. Wenn die Aktion geändert werden sollte, werden die verschiedenen Wahrscheinlichkeiten verwendet, um die neue Aktion auszuwählen.
In Ihrem Fall könnten die Zustände sein (etwas vereinfacht):
Jeder Zustand kann unterschiedliche Wahrscheinlichkeiten haben, um den Zustand zu ändern, zum Beispiel hält der verärgerte oder vernarbte Zustand möglicherweise nicht lange an. Die verschiedenen Staaten können auch unterschiedliche Regeln für das haben, was legal ist (der Wechsel von "schläfrig" zu "verspielt" kann illegal sein, aber Katzen scheinen sich nicht darum zu kümmern). Verschiedene Ereignisse können dazu führen, dass sich der Status ändert.
Werfen Sie einen Blick um , indem die Bahn für FSM und AI suchen und Sie können sehen , wie es funktioniert. Es mag kompliziert erscheinen, wenn man es erklärt, aber es ist wirklich einfach.
quelle
Sie können Tagging verwenden:
Es kann Bewegungsmarken wie "Legen", "Sitzen", "Stehen", "Gehen" und "Laufen" geben. Dann können Sie unrealistische Kombinationen von Tags eliminieren, z. B. "Legen" -> "Laufen" (dazwischen muss "Aufstehen" sein).
Andere Tags können Aktivitäten beschreiben: "Schlafen", "Essen", "Jagen" usw. Auch hier ist "Schlafen" -> "Jagen" ohne Zwischenzustände nicht möglich.
Da Animationen wie "Aufstehen" vorübergehend sind, kann es eine gute Idee sein, separate Tags für einen Anfang und ein Ende jeder Animation zu haben. Zum Beispiel kann "Aufstehen" ein Übergang von "Sitzen" zu "Bleiben" usw. sein.
Für jede Animation könnten Sie also einige Tags haben:
Mit diesen können Sie nur mögliche Kombinationen filtern, indem Sie Einschränkungen wie "
A->B
Nur möglich, wennfinal_movement_tag(A) == initial_movement_tag(B)
" festlegen , was zu einer viel kleineren Anzahl führt. Mit dieser möglichen Kombination können Sie das tun, was Sie beschrieben haben - Wahrscheinlichkeiten hinzufügen. Das Hinzufügen von Wahrscheinlichkeiten kann auf Aktivitäts-Tags basieren, da das Bleiben in derselben Aktivität wahrscheinlicher ist als das Ändern von Aktivitäten.Mit Tags können Sie möglicherweise die Erstellung aller Übergänge in Ihrem FSM- / Verhaltensbaum automatisieren und später optimieren, wenn Sie mit einigen Kombinationen nicht zufrieden sind.
quelle
Wenn Sie die umfangreichen Möglichkeiten von Verhaltensbäumen beibehalten möchten, können Sie eine neue Art von zusammengesetztem Auswahlknoten hinzufügen: den Markov-Auswahlknoten.
Sie müssten den Markov-Auswahlknoten selbst implementieren. Abhängig von dem (untergeordneten) Knoten, der zuvor erfolgreich war (oder fehlgeschlagen ist), wird zufällig einer seiner untergeordneten Knoten ausgewählt.
quelle