Un bon moyen de gérer l'IA hors écran?

16

Par exemple, le saké:

  • Disons qu'il y a 10 chambres dans le monde.
  • Et disons que le monde est habité par 10 entités.
  • Et chaque entité a sa propre "routine quotidienne" où elle effectue certaines actions dans la pièce et peut également naviguer entre les pièces.

Étant donné que le joueur ne peut être que dans une pièce à la fois, quel est un bon moyen de garder une trace des actions que les autres entités effectuent dans d'autres pièces hors écran?

  1. L'option la plus simple consiste à vérifier chacune des 10 entités sur chaque image, à vérifier leur position / état et à déterminer si l'entité doit ou non se trouver dans la pièce où se trouve le joueur à un moment donné. (Cela semble toutefois très lourd en termes de ressources, d'autant plus que le montant de la pièce / entité est augmenté.)
  2. Une autre option consiste à garder une trace du temps qui s'est écoulé depuis le début du jeu, puis chacune des entités vérifie si son motif intersecte la pièce où se trouve le joueur, et s'il le fait, vérifie par rapport au temps si oui ou non le l'entité est censée être dans la même pièce à ce moment particulier, les entités dont les motifs ne se croisent pas avec la pièce actuelle dans laquelle le joueur se trouve ne font rien tant que le joueur n'entre pas dans une pièce que leur motif recoupe et seulement à ce moment-là calculer si oui ou non ils devraient rendre. (Mais s'ils interagissent avec la pièce, ils devront toujours vérifier l'état des pièces qui croisent leur itinéraire afin de déterminer leur emplacement à ce moment, ce qui n'est pas terrible.)

  3. La troisième option à laquelle je suis parvenu serait tout d'abord de ne regarder que les itinéraires qui croisent l'emplacement du joueur (comme décrit précédemment), deuxièmement en entrant dans une pièce, vérifier si le joueur est dans cette pièce, sinon de ne vérifier que le état de la pièce et combien de temps faut-il pour passer à la pièce suivante. Par exemple, un PNJ concierge entre dans la pièce, vérifie l'état de la pièce, voit qu'il y a un déversement fait par le joueur, calcule le temps qu'il faudra pour nettoyer cela et combien de temps le cheminement prendra, etc. Et jusqu'à ce que le mentionné le temps est prévu pour entrer dans la pièce suivante, nous vérifions seulement si le joueur est dans la pièce. L'emplacement exact du PNJ à des fins de rendu ne serait calculé que lorsque le joueur entre dans la pièce.

Après un remue-méninges un moment, je suis arrivé à la troisième option, mais je me demandais s'il y avait peut-être une façon connue ou meilleure de gérer des choses comme celles-ci?

Plafond Gecko
la source
1
Cette question me rappelle un blog de développeur que j'ai lu pour un jeu appelé Project Zomboid.
Sumurai8

Réponses:

12

Une approche très simple consiste à utiliser "AI Level of Detail". En gros, cela signifie que vous mettez à jour l'IA plus fréquemment à mesure qu'elle est proche du lecteur / de la caméra. Vous pouvez également réduire la complexité des calculs d'IA plus éloignés, en particulier. pour trouver un chemin. Après tout, si le joueur ne voit pas bien le personnage ou pas du tout, il est inutile de mettre beaucoup d'efforts pour simuler le personnage avec la plus grande précision.

Dans votre exemple, la pièce dans laquelle le lecteur se trouve peut obtenir la plus grande précision (l'IA met à jour chaque image, pleine résolution). Les salles adjacentes pourraient obtenir la précision la plus élevée suivante (mises à jour tous les 10 ticks, supprimer le lissage de chemin et les animations). Toutes les autres salles peuvent obtenir la précision la plus faible (mises à jour toutes les secondes, recherche de chemin à faible résolution, éliminent les interactions NPC-à-NPC non essentielles).

Des jeux plus grands et plus complexes peuvent (et ont) utilisé des approches similaires. Ils pourraient simplifier les calculs de combat, téléporter des personnages plutôt que de les trouver quand ils ont besoin de se déplacer, etc.

Si votre jeu est assez grand pour que vous ne puissiez pas garder le tout en mémoire à tout moment, une bonne solution consiste alors à stocker la dernière heure de mise à jour dans les données enregistrées de la salle et à rejouer sa simulation hors écran (à sa résolution la plus basse) lorsque il est chargé en arrière.

Si vous vous attendez à ce que l'IA se déplace dans des zones "en direct" à partir de zones "endormies" non chargées selon un calendrier, vous souhaiterez soit créer des données de très faible fidélité pour que ces régions restent en mémoire à tout moment (par exemple, juste les plus grossières). navmesh niveau de détail et emplacement des objets / personnages clés) ou vous voudrez périodiquement faire défiler ces zones (par exemple, garder X zones "endormies" en mémoire et simulation à faible fidélité avec des mises à jour peu fréquentes, puis les faire alterner entre toutes les " endormies "qui contiennent des PNJ actifs clés, des zones de déchargement et de chargement au fur et à mesure).

Sean Middleditch
la source
1

Je stockerais les entités qui se trouvent actuellement dans une pièce dans cette instance de pièce, l'objet de pièce garderait également une trace des entités à mettre à jour (par exemple, voyager dans une autre pièce ou changer quelque chose dans cette pièce, etc.). Et je mettrais également à jour une (ou plusieurs) salle chaque seconde (peut-être dans un autre fil).

Lorsque vous mettez à jour une salle, les positions des PNJ doivent être mises à jour et toutes les actions qu'ils ont effectuées qui interagissent avec la salle depuis la dernière mise à jour doivent également être gérées, enfin l'heure de la prochaine mise à jour nécessaire doit être vérifiée / mise à jour.

Si une entité se déplace d'une pièce à une autre, son instance doit être stockée dans l'autre pièce et la prochaine mise à jour de l'entité doit également être mise à jour.

De cette façon, vous n'avez qu'à continuer de mettre à jour la pièce actuelle et les pièces qui ont une mise à jour programmée à ce moment, la mise à jour des autres pièces est juste facultative (mais recommandée si vous avez une IA qui se met à jour chaque fois que le joueur bouge ou fait quelque chose) .

jbakker
la source