arbre-de-comportement godot
Une implémentation GDScript d'un arbre de comportement pour l'IA du jeu, basée sur des nœuds Godot natifs et utilisant l'éditeur d'arbre de scène intégré.
VERSION C# -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
INSTALLATION
- Copiez le dossier 'addons' dans le répertoire principal de votre projet.
- Activez le plugin depuis les paramètres du projet, PUIS REDÉMARREZ Godot, sinon il ne reconnaîtra pas les nouvelles classes (c'est un bug du moteur).
- En option, vous pouvez également faire glisser le dossier bt_example dans le répertoire principal de votre projet.
- Pour voir l'exemple fonctionner, exécutez la scène agent.tscn. La scène ex_behavior_tree.tscn est un exemple de la façon dont l'arborescence est construite.
INSTRUCTIONS:
- Cliquez sur l'icône de création de nœud. Vous devriez voir de nouveaux nœuds disponibles (si ce n'est pas le cas, redémarrez Godot). Vous devez utiliser un BehaviourTree comme nœud racine, qui ne doit avoir qu'un seul enfant. Cet enfant peut être n'importe lequel des nœuds de la catégorie BTNode, qui héritent tous de la classe BTNode.
- Après avoir créé un arbre de comportement, vous devez spécifier qui est le propriétaire de l'IA (l'agent) et quel Blackboard est utilisé. Les tableaux noirs peuvent être placés n’importe où (à condition qu’ils se trouvent à l’extérieur de l’arbre) et même partagés entre différents arbres. Le système est suffisamment flexible pour vous permettre de décider comment et quand mettre à jour les données de votre tableau noir. Par exemple, vous pouvez créer un simple nœud avec un script qui gère la mise à jour du tableau noir, par exemple. avec des rappels de signal ou même en process(). Ou vous pouvez le faire depuis n'importe où ailleurs, même depuis l'intérieur de l'arbre, assurez-vous simplement de concevoir les choses de manière à ce que vous puissiez les entretenir et en assurer le suivi.
- Un arbre de comportement exécute chacun de ses enfants, qui renvoient une sorte d'état de réussite ou d'échec. Seules les branches suivant un nœud réussi seront exécutées. Un BTNode doit renvoyer un succès ou un échec et ne peut suspendre l'exécution qu'avec un appel à rendement(), après quoi il restera en cours d'exécution jusqu'à ce que l'exécution soit terminée. Lorsqu'un BTNode est en cours d'exécution, l'arborescence suspend progressivement l'exécution (à la seule exception de BTParallel ) jusqu'à ce que tous les enfants terminent l'exécution. Ceci est à des fins d'optimisation.
- Le flux de l'arborescence est défini par les nœuds dits composites : BTSequence, BTSelector, BTRandomSelector, BTRandomSequence, BTParallel qui héritent tous de BTComposite. Une séquence est réussie si tous les enfants réussissent, tandis qu'elle échoue si l'un des enfants échoue. Le sélecteur est l'opposé logique, il réussit si un enfant réussit et échoue si tous les enfants échouent. Un parallèle exécutera tous les enfants et réussira toujours malgré tout, SANS attendre que les enfants terminent l'exécution. Le nœud composite de base exécute tous les enfants et réussit toujours, mais il attend également la fin de l'exécution.
- Les actions de votre comportement IA sont réalisées dans les nœuds BTLeaf. Ajoutez un BTLeaf, puis effectuez « étendre le script ». Vous pouvez maintenant définir votre propre comportement dans ce script en remplaçant la méthode _ tick() . Vos actions iront ici. Assurez-vous de lire les commentaires dans le script de base pour connaître les meilleures pratiques. N'oubliez pas non plus que BTLeaf ne devrait pas avoir d'enfants.
- BTDecorator est utilisé pour personnaliser l'exécution d'un nœud enfant. Ils ne peuvent avoir qu’UN seul enfant.
- BTConditional est le type de décorateur le plus courant. Ajoutez un BTConditional et étendez le script, puis remplacez la méthode _ pre_tick() pour définir les conditions dans lesquelles l'enfant sera exécuté. Assurez-vous de lire le commentaire car il y a un exemple utile.
- Les BTGuards sont des décorateurs qui peuvent être utilisés pour verrouiller temporairement les branches. En option, vous pouvez attribuer un déverrouillage, qui remplacera le temps de verrouillage spécifié. Il existe également la possibilité d'attribuer un casier. Les BTGuards peuvent rendre votre comportement très riche et réactif, ainsi qu'optimisé, car ils évitent les branchements et les répétitions inutiles.
- D'autres décorateurs vous permettent d'exécuter une boucle, d'inverser le résultat du tick, etc. Vous pouvez faire beaucoup de choses en personnalisant l’exécution grâce aux décorateurs.
- Une bonne pratique consiste à utiliser les nœuds fournis et à suivre le modèle de conception de l'arbre de comportement. Mais comme il s’agit d’une implémentation purement basée sur du code sans aucun éditeur visuel, vous avez beaucoup de contrôle sur la conception et donc une marge d’erreur. Ce ne sont que des scripts utiles qui suivent certaines « bonnes pratiques », mais n'y sont pas liés, si ce n'est par quelques règles de base. C'est à vous de décider comment vous concevez votre arbre comportemental, mais gardez à l'esprit que si vous l'utilisez mal, vous ne bénéficierez pas de la puissance du modèle d'arbre comportemental. (par exemple, vous pouvez même utiliser le BTNode de base pour tout et simplement l'étendre à chaque fois, même si ce serait un gâchis)
- Vous pourriez avoir un énorme arbre de comportement, mais la meilleure pratique consiste à suivre la philosophie des composants de Godot et à créer plusieurs arbres de comportement plus petits pour chaque composant de votre scène. Par exemple, un arbre pour votre contrôleur de mouvement, un arbre pour votre contrôleur d'armes, un arbre pour votre composant pathfinder, etc. Un arbre de comportement ne peut avoir qu'un seul tableau noir, mais le même tableau noir peut être utilisé par plusieurs arbres, c'est donc particulièrement pratique si vous souhaitez avoir plusieurs arbres sans également créer plusieurs tableaux noirs. Personnellement, la raison pour laquelle j'ai le tableau noir comme composant découplé, c'est parce que je voulais créer des escouades d'ennemis partageant les mêmes données mais se comportant indépendamment, c'est donc un cas d'utilisation pour cela. De plus, j'ai généralement plusieurs composants dans mes acteurs, et je souhaite utiliser la même base de données pour différents arbres.