Generische C# GOAP (Ziel orientierte Aktionsplanung) Bibliothek mit Unity3D -Beispielen und Helferklassen.
Diese Bibliothek ist sehr generisch. Wenn Sie den Unity -Ordner nicht einfügen, können Sie ihn in einer Spielermotor verwenden.
Überprüfen Sie zunächst das Beispiel für die Einheit FSM hier.
In diesem Beispiel wird die Regoap -Bibliothek in Einheit mit einem einfachen FSM (Finite -State -Maschine) verwendet, um das Makroverhalten zu bewältigen (in den meisten Spielen sollten drei FSM -Staaten ausreichen: Leerlauf, Goto, Animate).
Um es zu verwenden, um ein neues Einheitsprojekt zu erstellen, öffnen Sie die Shell, gehen Sie zum Verzeichnis der Vermögenswerte und klonen Sie das gesamte Repository darin:
git clone https://github.com/luxkun/ReGoap.git(In Windows können Sie dasselbe mit der Befehlszeile oder einem beliebigen Git -Client tun. Außerdem können Sie einfach auf "Klon oder Download" klicken und dann "Zip herunterladen").
Außerdem können Sie einfach das Unity -Paket der letzten Veröffentlichung herunterladen, das wahrscheinlich nicht die neuesten Änderungen, hier oder im Unity Asset Store hat.
(Wenn Sie nur die Bibliothek verwenden möchten und einen erklärten Beispiel wünschen, überspringen Sie die Verwendung von Regoap .)
Bevor Sie erklären, wie Sie diese Bibliothek in Ihrem Spiel verwenden, lassen Sie mich erklären, wie ein GOAP -System funktioniert, beginnend mit einem Zitat von Jeff Orkin
Goal-Oriented Action Planning (aka GOAP, rhymes with soap) refers to a simplfied STRIPS-like planning architecture specifically designed for real-time control of autonomous character behavior in games.
Grundsätzlich finden Sie nur einen Plan (eine Liste von Aktionen), die die Ziele des ausgewählten Ziels erfüllt.
Das Hauptkonzept, das Sie verstehen müssen, sind: Zustände, Handeln, Ziel, Gedächtnis und Sensoren
ist eine Definition der Welt, in dieser Bibliothek werden sie als Wörterbuch der String to Object (Dictionary <String, Object>) behandelt.
Schauen Sie sich die RegoapState -Klasse in dieser Datei an: https://github.com/luxkun/regoap/blob/master/regoap/core/regoapstate.cs
Beispiel: 'Isat': 'Feind', 'isWarned': wahr, 'Hasweapon': wahr
Kann als eine Liste von Voraussetzungen und Effekten definiert werden, sind dies die Aktionen, die der Agent (AI Pawn, von nun an als Agent bezeichnet wird) ausführen kann.
Die Voraussetzungen sind die Anforderung, dass die Aktion ausgeführt werden muss, die als Zustand beschrieben werden muss, die Auswirkungen, wie der Name schon sagt, die Auswirkungen der Aktion sowie als Zustand beschrieben.
Beispiele:
Wichtig : Falsche Voraussetzungen werden nicht unterstützt . . Wenn Sie möchten, können Sie den Ausgang in Ihrer Regoapaktion überschreiben und die Effekte auf den Speicher einstellen, beispielsweise folgen.
Kann als eine Liste von Anforderungen definiert werden, die als Staat beschrieben werden, ist dies im Grunde das, was der Agent tun sollte.
Beispiele:
Ist die Erinnerung des Agenten, alles, was der Agent kennt und fühlt, sollte hier eingefügt werden. Ein Speicher kann auch viele Sensoren in dieser Bibliothek haben, die ein Speicherhelfer sind. Grundsätzlich besteht die Aufgabe des Gedächtnisses darin, einen "Welt" -Staat zu erstellen und auf dem Laufenden zu halten.
ist ein Speicherhelfer, es sollte ein bestimmtes Zielfernrohr verarbeiten.
Beispiel:
Jetzt sollten Sie verstehen, wofür eine GOAP -Bibliothek ist und wofür Sie sie verwenden sollten. Wenn Sie immer noch Fragen haben oder mehr über dieses Feld erfahren möchten, rate ich Ihnen, Jeff Orkins Papiere hier zu lesen: http://alumni.media.mit. edu/~ Jorkin/
git clone https://github.com/luxkun/ReGoap.gitWas ist mehr? Nichts wirklich, die Bibliothek wird die gesamte Planung übernehmen, die Aktionen auswählen, um ein Ziel zu vervollständigen und das erste zu führen, bis es fertig ist, dann die zweite und so weiter, was Sie tun müssen, ist Ihre eigenen Aktionen und Ziele zu implementieren.
In den nächsten Absätzen werde ich erklären, wie Sie Ihre eigenen Klassen erstellen (aber für die meisten Verhaltensweisen, die Sie zum Implementieren benötigen, ist Goapaction und Goapoal).
Schauen Sie sich die Aktionen in diesem Beispiel an: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/actions
Sehen Sie sich die Implementierung von Regoapaction an, um zu sehen, welche Funktionen Sie überschreiben können: https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapaction.cs
Sie müssen Ihre eigene Regoapaktion implementieren, indem Sie eine IREGoAPACTION -Schnittstelle implementieren oder die Regoapaktion erben. Wählen Sie mit Bedacht die generischen Typen aus, sie müssen über alle Klassen des Agenten gleich sein. Normalerweise ist das Objekt das generischste, auch int/enum, das Objekt ist ebenso generisch, aber leichter.
Für eine einfache Implementierung müssen Sie nur Folgendes tun:
public class MyGoapAction : ReGoapAction < string , object >
{
protected override void Awake ( )
{
base . Awake ( ) ;
preconditions . Set ( " myPrecondition " , myValue ) ;
effects . Set ( " myEffects " , myValue ) ;
}
public override void Run ( IReGoapAction < string , object > previous , IReGoapAction < string , object > next , ReGoapState < string , object > settings , ReGoapState < string , object > goalState , Action < IReGoapAction < string , object > > done , Action < IReGoapAction < string , object > > fail )
{
base . Run ( previous , next , goalState , done , fail ) ;
// do your own game logic here
// when done, in this function or outside this function, call the done or fail callback, automatically saved to doneCallback and failCallback by ReGoapAction
doneCallback ( this ) ; // this will tell the ReGoapAgent that the action is succerfully done and go ahead in the action plan
// if the action has failed then run failCallback(this), the ReGoapAgent will automatically invalidate the whole plan and ask the ReGoapPlannerManager to create a new plan
}
}Wie vor der Regoapaktion geschrieben, schreiben Sie standardmäßig die Auswirkungen auf den Speicher, aber der Speicher sollte überprüfen, ob die Effekte effektiv erfolgen. Wenn Sie aus irgendeinem Grund die Effekte am Ende der Aktion festlegen möchten, können Sie hinzufügen Dieser Code für Ihre Regoapaktion -Implementierung:
public override void Exit ( IReGoapAction < string , object > next )
{
base . Exit ( next ) ;
var worldState = agent . GetMemory ( ) . GetWorldState ( ) ;
foreach ( var pair in effects ) {
worldState . Set ( pair . Key , pair . Value ) ;
}
}Sie können auch Voraussetzungen und Effekte haben, die basierend auf den Voraussetzungen/Effekten der nächsten Aktion dynamisch verändert werden. So können Sie mit einer GOTO -Aktion in Ihrem Agenten umgehen.
Schauen Sie sich FSMexample an, um zu sehen
Dies ist weniger schwierig, der größte Teil des Ziels wird nur die Awake -Funktion überschreiben, um Ihren eigenen Zielzustand (Ziele) hinzuzufügen.
Wie auch immer
Schauen Sie sich auch die Ziele in diesem Beispiel an: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/goals
public class MyGoapGoal : ReGoapGoal < string , object >
{
protected override void Awake ( )
{
base . Awake ( ) ;
goal . Set ( " myRequirement " , myValue ) ;
}
}Hinweis : Stellen Sie sicher, dass Sie regoapoaladvanced verwenden, wenn Sie den Agenten automatisch warnen möchten, dass ein Ziel nicht verfügbar ist/ist.
Schauen Sie sich hier die Basisklasse der Goapensor -Basis an: https://github.com/luxkun/regoap/blob/master/regoap/unity/goapsensor.cs
Weitere Informationen finden Sie hier: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/sensors
Wie immer müssen Sie Ihre eigene Klasse implementieren, indem Sie Regoapsensor erben oder eine IreGoapsensor -Schnittstelle implementieren.
public class MySensor : ReGoapSensor < string , object >
{
void FixedUpdate ( )
{
var worldState = memory . GetWorldState ( ) ;
worldState . Set ( " mySensorValue " , myValue ) ; // like always myValue can be anything... it's a GoapState :)
}
}HINWEIS : Verwenden Sie bei der Arbeit mit Sensoren RegoApMemoryAdvanced, da die Basisklasse Sensoren nicht überprüft und aktualisiert.
Um Ihren eigenen Agenten zu debuggen, können Sie natürlich selbst mit Ihrem Lieblingsredakteur debuggen.
Aber Regoap hat einen sehr benutzerfreundlichen Debugger für Agenten in Unity BLOB/Master/Regoap/Unity/Editor/RegoapnodeBaseDitor.cs).
Um es zu verwenden, klicken Sie einfach auf das Menüfenster der Einheit und dann Regoap Debugger , ein Einheitfenster, dies ist der Agent -Debugger.
Wenn Sie nun auf einen Agenten in Ihrer Szene klicken (während Sie das Spielen nur für laufende Agenten bearbeiten), aktualisiert das Fenster automatisch, sodass Sie über die "Gedanken" des Agenten (aktueller Weltstaat, ausgewähltes Ziel und aktueller Plan, Possibile -Ziele, mögliche Aktionen, mögliche Aktionen, mögliche Maßnahmen, möglichst Was kann getan werden und was nicht, versuchen Sie es!).
Jede Pull -Anfrage wird geschätzt. Überprüfen Sie einfach die Einheitstests ( Menüfenster -> Editor -Tests Läufer -> Alle ausführen ), bevor Sie sich verpflichten, und um den gleichen Codestil zu führen.