D'après ce que je comprends des arbres de comportement, chaque comportement devrait être une courte action orientée vers un objectif qui pourrait être effectuée en quelques itérations.
Ainsi, par exemple, ci-dessous est une image d'un arbre de comportement:
Supposons maintenant que le comportement Drive To Enemy prend plus de quelques itérations dans l'arborescence. Ainsi, à chaque passage, Drive To Enemy est appelé car il est maintenant en cours d' exécution .
Le problème est que je veux appeler Evade Enemy si un ennemi est à proximité. Et étant donné que Drive To Enemy est toujours appelé, je n'ai jamais la chance d'appeler Evade Enemy ( devrait probablement être appelé Eviter l'ennemi ).
- Dois-je traverser l'arborescence CHAQUE passe, quelle que soit l'action en cours?
- Est-ce que j'y vais de la bonne façon?
- Quelle est la bonne façon de gérer un tel comportement?
Initialement demandé sur Stackoverflow. Pensé ici serait un endroit plus approprié pour poser cette question.
Réponses:
Voir l'image que j'ai fournie dans ma réponse précédente :
Si vous imaginez que le nœud 1 est 'Evade Enemy' et que le nœud 2 est 'Chase Enemy', vous verrez que même si dans la deuxième itération (quand tout est vert sauf pour '2' et 'B' est quand la deuxième itération commence), 'Evade Enemy' est toujours vérifié en premier. Ce n'est que lorsque «Evade Enemy» échoue, car il n'y a pas d'ennemis à proximité, que «Chase Enemy» est à nouveau activé. Lorsque 'Chase Enemy' est visité à nouveau, il remarque qu'il est à l'état 'en cours d'exécution' et passe directement à 'B'.
Cela signifie que chaque fois que l'arbre est vérifié, il se déplacera toujours de gauche à droite. Même lorsqu'un nœud est marqué comme en cours d'exécution, les nœuds de priorité supérieure sont toujours vérifiés en premier.
Je ne sais pas si vous avez l'intention de traiter vos nœuds de droite à gauche, mais c'est comme cela que vous semblez les avoir disposés (c'est-à-dire que sous l'évasion de l'ennemi, localiser l'ennemi est à droite de la conduite dans la direction opposée). Si vous avez besoin d'explications supplémentaires, vous devriez poser une question par chat ou dans l'une de vos questions existantes sur le sujet.
la source