Arbres de comportement :: Actions qui prennent plus d'une tique

19

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:

entrez la description de l'image ici

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.

Lancer gratuit
la source
1
La réponse fournie ici vous aide-t-elle? gamedev.stackexchange.com/questions/51693/…
Tetrad
C'est aussi ma question. J'allais poster cette question en tant que commentaire, mais j'ai pensé que cela devrait être une question distincte.
Lancer gratuit

Réponses:

16

Voir l'image que j'ai fournie dans ma réponse précédente :

entrez la description de l'image ici

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.

MichaelHouse
la source
2
Merci pour une autre grande explication. J'avais du mal à comprendre la nature récursive des arbres de comportement. J'allais vous demander dans le commentaire de la dernière question, mais je ne voulais pas transformer les commentaires en un long AQ. Une dernière question cependant, tout cela a du sens maintenant. Existe-t-il une différence entre les sélecteurs et les séquences dans la gestion des états d'exécution? Il semble que le sélecteur (Node 0) ait vérifié le Node 1 en premier, tandis que la séquence "Node 2" n'a pas vérifié le Node A, lors de la deuxième itération.
Lancer gratuit
4
Bonne question, je pense que vous l'obtenez. Le nœud 2 n'a pas vérifié le nœud A car ce nœud A était terminé. Lorsque le nœud 2 est marqué comme «en cours d'exécution», il note que le nœud B est le nœud en cours d'exécution. Vous pouvez supposer que si un nœud est en cours d'exécution, cela signifie que les nœuds précédents n'ont pas besoin d'être vérifiés à nouveau.
MichaelHouse
Réinitialisez-vous le sélecteur de racine (0) sur "READY" après qu'il a été défini sur "RUNNING" après la première itération?
Lancer gratuit le
Je crois que seul le parent du nœud en cours d'exécution est défini sur Running. La racine doit être définie sur ready au lieu de s'exécuter car nous devons à nouveau analyser le nœud (1).
MichaelHouse
3
Voilà une option. Vous pouvez le mettre à jour aussi souvent ou rarement que vous le souhaitez. Toutes les 300 ms si vous le souhaitez, ou chaque trame. Ou vous pouvez avoir une mise à jour fixe ainsi qu'une mise à jour déclenchée pour gérer tous les événements. Les arbres de comportement, comme avec la plupart des structures comme celle-ci, ne sont pas strictement définis. Ils doivent être utilisés de la meilleure façon possible pour votre jeu. Si l'évaluation de chaque image est trop inutile, ne le faites pas. Vous pouvez également limiter le temps passé à évaluer un arbre et revenir à l'image suivante si vous le souhaitez. Il y a beaucoup d'options.
MichaelHouse