Je commence à implémenter l'IA du joueur et de l'ennemi dans un jeu, mais je ne sais pas comment l'implémenter au mieux dans une architecture de jeu basée sur les composants.
Disons que j'ai un personnage de joueur suivant qui peut être stationnaire, courir et balancer une épée. Un joueur peut passer à l'état d'épée pivotante à la fois à partir de l'état stationnaire et en cours d'exécution, mais ensuite le swing doit être terminé avant qu'il ne puisse reprendre la position debout ou courir. Pendant le swing, le joueur ne peut pas se déplacer.
Selon moi, j'ai deux approches de mise en œuvre:
- Créez un seul composant AI contenant toute la logique du joueur (soit découplé du composant réel, soit incorporé en tant que PlayerAIComponent). Je peux facilement appliquer les restrictions d'état sans créer de couplage entre les composants individuels composant l'entité du joueur. Cependant, le composant AI ne peut pas être décomposé. Si j'ai, par exemple, un ennemi qui ne peut que se tenir debout et marcher ou se promener et parfois balancer une épée, je dois créer de nouveaux composants d'IA.
- Décomposez le comportement en composants, chacun identifiant un état spécifique. J'obtiens alors un StandComponent, WalkComponent et SwingComponent. Pour appliquer les règles de transition, je dois coupler chaque composant. SwingComponent doit désactiver StandComponent et WalkComponent pendant la durée du swing. Lorsque j'ai un ennemi qui ne fait que rester debout, balançant une épée de temps en temps, je dois m'assurer que SwingComponent ne désactive WalkComponent que s'il est présent. Bien que cela permette de meilleurs mélanges et correspondances, cela peut conduire à un cauchemar de maintenabilité car chaque fois qu'une dépendance est ajoutée, les composants existants doivent être mis à jour pour bien jouer avec les nouvelles exigences que la dépendance impose au personnage.
La situation idéale serait qu'un concepteur puisse construire de nouveaux ennemis / joueurs en faisant glisser des composants dans un conteneur, sans avoir à toucher une seule ligne de moteur ou de code de script. Bien que je ne sois pas sûr que le codage de script puisse être évité, je veux le garder aussi simple que possible.
Pour résumer le tout: dois-je lober toute la logique de l'IA en un seul composant ou décomposer chaque état logique en composants séparés pour créer plus facilement des variantes d'entité?
edit : Je soupçonne qu'il y a une certaine confusion sur ce que je voulais dire avec la première et la deuxième situation. J'ai essayé de l'expliquer dans le diagramme ci-dessous.
Notez la relation entre les états individuels et l'entité. Dans la première situation, un composant AI est pré-construit avant d'être mis dans l'entité. Un concepteur peut uniquement choisir parmi un ensemble distinct de composants AIC mis à disposition par le programmeur. La deuxième situation a les différents états au même niveau que les autres composants. Un concepteur peut désormais créer une entité avec une IA unique sans interférence d'un programmeur.
La question est, sont-ce les deux seules options pour structurer l'IA dans une entité basée sur des composants et, si oui, qu'est-ce qui donnerait la flexibilité maximale?