Bibliothèque générique C # GOAP (Planification d'action axée sur les objectifs) avec des exemples et classes d'aides Unity3D.
Cette bibliothèque est très générique, si vous n'incluez pas le dossier Unity, vous pouvez l'utiliser dans n'importe quel moteur de jeu.
Commencez par consulter l'exemple Unity FSM ici.
Cet exemple utilise la bibliothèque RegoAP dans Unity avec un simple FSM (Machine d'état finie) pour gérer les comportements macro (dans la plupart des jeux, trois états FSM devraient suffire: inactif, goto, animate).
Pour l'utiliser, créez un nouveau projet Unity, ouvrez le shell, accédez au répertoire des actifs et clonez l'ensemble du référentiel:
git clone https://github.com/luxkun/ReGoap.git(Dans Windows, vous pouvez faire de même avec la ligne de commande ou n'importe quel client Git, vous pouvez également cliquer sur "clone ou télécharger", puis "télécharger zip")
Vous pouvez également télécharger le package Unity de la dernière version, qui n'aura probablement pas de dernières modifications, ici ou sur le magasin Unity Asset.
(Si vous souhaitez simplement utiliser la bibliothèque et que vous souhaitez un exemple expliqué, passez à l'utilisation de RegoAP )
Avant d'expliquer comment utiliser cette bibliothèque dans votre jeu, laissez-moi expliquer comment fonctionne un système GOAP, en commençant par une citation de 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.
Fondamentalement, tout ce qu'il fait est de trouver un plan (une liste d'actions) qui remplira les objectifs du but choisi.
Le concept principal que vous devez comprendre est: les états, l'action, l'objectif, la mémoire et les capteurs
est une définition du monde, dans cette bibliothèque, ils sont traités comme un dictionnaire de chaîne à objet (dictionnaire <string, objet>).
Consultez la classe RegoAPState dans ce fichier: https://github.com/luxkun/regoap/blob/master/regoap/core/regoapstate.cs
Exemple: «Isat»: «ennemi», «iswarned»: true, «Haswapon»: true
Peut être défini comme une liste de conditions préalables et d'effets, ce sont les actions que l'agent (IA Pawn, sera appelée agent à partir de maintenant).
Les conditions préalables sont l'exigence que l'action doit être exécutée, décrite comme un état, les effets, comme son nom l'indique, sont les effets de l'action, tout comme un état.
Exemples:
IMPORTANT : Les fausses préconditions ne sont pas prises en charge importantes : les effets de l'action ne sont pas écrits dans la mémoire lorsque l'action est terminée, c'est un comportement recherché car dans la plupart des jeux, vous voudrez définir ces variables à partir de la mémoire ou des capteurs . Si vous le souhaitez, vous pouvez remplacer la sortie dans votre régulation et définir les effets sur la mémoire, exemple suivant.
Peut être défini comme une liste des conditions requises, décrite comme un état, c'est essentiellement ce que l'agent doit faire.
Exemples:
est la mémoire de l'agent, tout ce que l'agent connaît et ressent devrait être inséré ici. Une mémoire peut également avoir de nombreux capteurs, dans cette bibliothèque, qui sont une aide à la mémoire. Fondamentalement, le travail de la mémoire consiste à créer et à rester à jour un état «mondial».
est une aide à mémoire, il devrait gérer une portée spécifique.
Exemple:
Maintenant, vous devez comprendre à quoi sert une bibliothèque GOAP et pour quoi vous devriez l'utiliser, si vous avez toujours des questions ou que vous voulez en savoir plus sur ce champ, je vous conseille de lire les articles de Jeff Orkin ici: http://alumni.media.mit. edu / ~ jorkin /
git clone https://github.com/luxkun/ReGoap.gitQuoi de plus? Rien vraiment, la bibliothèque gérera toute la planification, choisira les actions pour atteindre un objectif et exécuter la première jusqu'à ce qu'elle soit terminée, puis la seconde et ainsi de suite, tout ce que vous avez à faire est de mettre en œuvre vos propres actions et objectifs.
Dans les paragraphes suivants, je vais expliquer comment créer vos propres classes (mais pour la plupart des comportements, tout ce dont vous avez besoin pour mettre en œuvre est GoAPAction et GoAPGoal).
Consultez les actions dans cet exemple: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/Actions
Consultez la mise en œuvre de Regoapaction, pour voir quelles fonctions vous pouvez remplacer: https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapaction.cs
Vous devez implémenter votre propre Regoapaction en mettant en œuvre l'interface IreGoapaction ou en héritage de Regoapaction. Choisissez judicieusement les types génériques, ils doivent être les mêmes dans toutes les classes de l'agent. Habituellement, la chaîne, l'objet est l'objet le plus générique, également int / enum, l'objet est aussi générique mais plus léger.
Pour une implémentation simple, tout ce que vous avez à faire est de la suivante:
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
}
}Comme écrit avant la régulation de la Regoapaction n'écrit pas par défaut les effets sur la mémoire, mais la mémoire doit vérifier si les effets sont effectivement effectués, si vous souhaitez définir les effets à la fin de l'action que vous pouvez ajouter Ce code à votre implémentation Regoapaction:
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 ) ;
}
}Vous pouvez également avoir des conditions préalables et des effets qui sont modifiés dynamiquement en fonction des conditions / effets de l'action suivante, par exemple, comment vous pouvez gérer une action GOTO dans votre agent.
Consultez FSMexample pour voir comment procéder: https://github.com/luxkun/regoap/blob/master/regoap/unity/fsmexample/actions/genericgotoaction.cs
Ceci est moins délicat, la majeure partie de l'objectif ne fera que remplacer la fonction Awake pour ajouter votre propre état de but (objectifs).
Quoi qu'il en soit, regardez RegoapGoal, comme tout ce que vous avez pour implémenter votre propre classe à partir de zéro en implémentant l'interface ireGoapgoal ou en héritage de Regoapgoal: https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapgoal.cs
Consultez également les objectifs de cet exemple: 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 ) ;
}
}Remarque : Assurez-vous d'utiliser RegoapGoalAdvanced si vous souhaitez avertir automatiquement l'agent qu'un objectif est / n'est pas disponible.
Consultez la classe de base de GoapSensor ici: https://github.com/luxkun/regoap/blob/master/regoap/unity/goapsensor.cs
Consultez des exemples ici: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/sensors
Comme toujours, vous devez implémenter votre propre classe en héritant de RegoapSensor ou en implémentant l'interface IreGoapSensor.
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 :)
}
}Remarque : assurez-vous d'utiliser RegoAPMemoryAdvanced lorsque vous travaillez avec des capteurs, car la classe de base ne vérifie pas et ne met pas à jour les capteurs.
Pour déboguer votre propre agent, vous pouvez, bien sûr, déboguer par vous-même, avec votre éditeur préféré.
Mais RegoAP a un débogueur très utilisateur pour les agents dans Unity (https://github.com/luxkun/regoap/blob/master/regoap/unity/editor/regoapnodeedorit.cs et https://github.com/luxkun/regoap/ Blob / Master / Regoap / Unity / Editor / RegoAPNodeBaseEditor.cs).
Pour l'utiliser, cliquez simplement sur la fenêtre de menu d'Unity, puis RegoAP Debugger , une fenêtre Unity s'ouvrira, c'est le débogueur d'agent.
Maintenant, si vous cliquez sur un agent de votre scène (tout en jouant, ne fonctionne que sur des agents de course), la fenêtre mettra automatiquement à jour pour vous faire connaître les "pensées" de l'agent (état mondial actuel, objectif choisi et plan actuel, objectifs possibles, actions possibles, Que peut-il être fait et quoi, essayez-le!).
Toute demande de traction est appréciée, assurez-vous de vérifier les tests d'unité ( fenêtre de menu -> Tests Editor Runner -> Exécutez tout ) avant de s'engager et de garder le même style de code.