Donc: jeu de haut en bas, mes ennemis pourchassent le joueur, quand ils arrivent à une certaine distance, ils restent immobiles et tirent. S'ils viennent tous de la même direction, ils finissent tous par se tenir au même endroit (c'est-à-dire qu'ils se tiennent «l'un dans l'autre»), car je ne fais pas actuellement de détection de collision entre ennemis - ils sont libres de passer les uns sur les autres.
Quel est un moyen simple de contourner cela? Soit une forme de détection de collision, soit une IA?
Réponses:
Vous n'avez pas besoin de détection de collision, mais vous devrez donner à vos ennemis un peu d'intelligence et les faire éviter de se heurter les uns aux autres. La détection de collision sans cela ne fera que rendre vos ennemis stupides de toute façon - les gens s'évitent, ils ne se heurtent généralement pas.
Recherchez "flocage" pour certains comportements simples.
L'idée de base est que les choses doivent se diriger vers le joueur, mais loin d'un obstacle proche (les uns des autres, les murs, ce genre de choses).
la source
Vous pouvez vous inspirer sur les comportements de flocage , tels que les Boids .
Celles-ci ont tendance à consister en 3-4 règles très simples qui, appliquées correctement, conduisent à des comportements très satisfaisants et "d'apparence complexe".
Dans votre cas, vous pouvez essayer quelque chose comme ceci:
la source
Ce que vous demandez en général, c'est l'évitement dynamique entre les acteurs. Vous pouvez jeter un œil aux obstacles de vitesse: http://gamma.cs.unc.edu/RVO/
la source
Vous voudrez peut-être consulter la diffusion collaborative (de superbes animations ici) ou un autre type de motif anti-objet pour le mouvement. Bien que l'algorithme de diffusion en soi ne puisse pas empêcher les ennemis de traverser, vous pouvez ajouter des contraintes supplémentaires pour le rendre peu probable ou impossible.
la source
Et si vous refusez de passer par d'autres unités? Il me semble que vous en aurez besoin tôt ou tard. Chaque fois que le chemin actuel est bloqué par une unité, ajustez le chemin pour vous déplacer.
la source
Il y a une référence pour les comportements de direction et de flocage sur le site Web de Craig Reynold . Ils sont relativement simples à mettre en œuvre mais peuvent produire de beaux comportements émergents.
la source
Toutes les autres réponses produisent un meilleur résultat, mais le moyen le moins cher (?) D'éviter le regroupement complet consiste à simplement ajouter un vecteur aléatoire qui représente peut-être 25% du vecteur de mouvement calculé d'origine afin que les objets rebondissent un peu dans un groupe d'objets blob généraux . Cela ne gardera pas les choses complètement éloignées les unes des autres, mais selon ce que vous essayez de réaliser, j'ai trouvé que cela pouvait être suffisant. Les objets peuvent toujours se regrouper avec cette méthode si vous faites des cercles autour d'eux, mais avec le temps, ils ont tendance à se diffuser.
Voici un petit jeu que j'ai fait il y a plusieurs années et qui illustre cette méthode: http://deleter.phatcode.net/index.php?page=projects&p=4
la source
Les gens apportent toujours des boids car cela donne de très bons résultats, mais leur mise en œuvre peut être excessive pour votre objectif spécifique. Dans le passé, j'ai obtenu de très bons résultats en randomisant simplement la position cible dans un petit cercle.
Par exemple, pour une I démonstration construite à Unity I utilisé la commande Random.insideUnitSphere pour faire puffballs flocage
la source
J'étais confronté au même problème lorsque j'utilisais NevMeshAgent comme ennemi, les énémites pénètrent dans l'autre, donc j'augmente la
Rayon de NavMeshAgent
Merci à gameDevAnswer
la source