1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

"meilleure" façon de déplacer un npc vers une cible ?

Discussion dans 'Discussions générales autour de Half-Life 1' démarrée par Midori, 18 Juillet 2014.

  1. Midori

    Midori Membre

    J'ai vu les différentes méthodes qui existaient pour faire bouger un NPC, mais je me demande s'il est mieux d'utiliser des Waypoints OU d'utiliser le A* pathing.

    Le A* Pathing est très bien mais s'il y a un trentaine de NPCs en même temps je n'imagine même pas le nombre de calculs que le serveur devra effectuer ...

    Et le plus gros problème c'est le cas où le joueur se met un peu en hauteur et que le NPC est bloqué en dessous :
    On se met sur une caisse haute, le NPC sera en bas, collé à la caisse, en train de nous regarder ou toujours en train de courir contre la caisse. Ce cas là m'a l'air un peu difficile à détecter et résoudre.

    Si quelqu'un a une idée sur les différentes procédures possibles et efficaces qui règlent des problèmes comme celui cité ci-dessus, je suis preneur.

    Etant donné que je me lance dans un module où plusieurs NPCs sont développés ( Zombies, Tourelles, Humains avec des armes, ... ), c'est le plus grand problème du module.

    Du moment que le temps d'exécution est faible et que c'est fiable, c'est une bonne solution on va dire :) 
    --- Message fusionné : 18 Juillet 2014 ---
    Et j'aimerais savoir si quelqu'un a des idées pour faire monter un NPC sur des escaliers facilement : faire monter une pente, c'est très facile, mais pour les escaliers c'est différent ...
     
    Tags:
  2. Arkshine

    Arkshine Le Docteur

    Je ne suis pas certain que tu aies beaucoup de réponses sur ce forum. :ROFLMAO: 

    Je n'ai aucun expérience dans le pathing.
    Ceci dit pour ton problème de caisse, ça me semble assez bizarre, et ça ne me semble pas la faute du pathing. Je ne sais pas comme tourne l'ensemble, mais si le NPC voit qu'il ne peut pas aller de l'avant, suffit de contourner. A partir de là, c'est juste de la logique dans le comportement du NPC, genre "si il ne peut pas monster, s'il n'existe pas de chemins direct, au bout de X essais il va à gauche ou a droite selon le chemin le plus court". Après il y a tout un tas de situations, mais je ne crois pas que ce soit bien difficile de faire une liste de possible mouvements en cas de blocage et de l'executer séquentiellement jusqu'à obtenir une solution.

    Pour le cas des escaliers, normalement tu n'as pas en t'en soucier, ça devrait se comporter comme un vrai joueur non ? Après s'il faut sauter, et bien je souhaite bon courage. :notworthy: 
     
  3. Midori

    Midori Membre

    Le problème des escaliers c'est que ce sont des blocs, et que le NPC sera bloqué et ne pourra pas monter, tandis que si c'est juste une pente là il n'y a aucun problème, je pense que l'alternative (pour pas me prendre la tête et faire des détections supplémentaires dans le code et donc l'alourdir), c'est de créer moi même une pente non visible partout là où il y a des escaliers pour les joueurs et donc les NPCs pourront passer normalement.

    Au niveau du mouvement pour les NPCs, je pense que je vais faire énormément de Waypoints, un peu comme sur cette image :

    [​IMG]

    Je vais faire que si le NPCs peut voir directement le joueur (Faire un traceline qui ne détecte rien entre les deux entités), dans ce cas là je ne m'occupe plus des waypoints et le NPC suivra directement le joueur en ligne droite, sinon il faudra que je trace une/des ligne(s) au niveau des waypoints pour trouver le meilleur chemin, et ensuite check toutes les 0.5 secondes (on va dire) si le NPC peut voir le joueur directement.

    Je pense que ça devrait être pas mal comme ça :LOL: 

    EDIT : Je ne sais pas si je devrais mettre des liaisons explicitent entre les waypoints, comme "le waypoint X relie aux waypoints Y, Z", cela permettrait sûrement le traçage NPC -> Joueur plus facile et rapide.

    Exemple : Le joueur se trouve à une position, on cherche le waypoint qui a pour caractérisque :
    - D'être le plus proche du NPC
    - D'avoir un traceline qui ne détecte aucune entité entre le Joueur et lui même

    Ensuite, une fois que le waypoints pour commencer le chemin est trouvé, on test si Y ou Z est le plus proche du NPC, ainsi de suite, comme ça on aura une série de Waypoints à suivre, par exemple : Joueur --> X --> R --> B --> A --> NPC

    Mais après ce qui est chaud c'est de gérer quand le joueur bouge, je pense vérifier les waypoints par rapport aux joueurs toutes les 1.0 secondes pour chaque NPC, pour pas que ça ne bouffe trop de performances, ça devrait le faire (je pense :eek: ).

    Au niveau du A* Pathing je pense que niveau performance c'est même pas la peine d'y penser, au bout d'une dizaine de NPC (et encore), je sais même pas si on commencerait à voir les effets.

    --- Message fusionné : 20 Juillet 2014 ---
    Donc voici la situation :

    cs_amx_show_npc.

    En rouge : Le malin qui voudra empêcher les NPCs (pour les type zombies, les soldats on s'en fout ils donneront leur coup d'AWP dans la tête :ROFLMAO: ) de l'attaquer.
    En violet : Le NPC en question.

    Les alternatives c'est soit :
    - Je déclare des Waypoints spéciaux qui indiquent au NPC qu'il faut sauter à ces différents endroits pour accéder au joueur (c'est un peu énervé comme méthode et bof je pense :cyclops: ).
    - J'annonce au NPC de passer son chemin s'il voit que le joueur est inaccessible.
    - J'annonce au NPC qu'il faut sauter et attaquer les pieds du monsieur.
    - Si il y a un autre NPC ils se font une courte échelle et l'autre NPC rejoins le joueur sur la plateforme pour lui faire un câlin.
     
    Dernière édition: 20 Juillet 2014
  4. Arkshine

    Arkshine Le Docteur

    Tout dépend comment tu détectes/avances le NPC, non? Un joueur en dessous d'une certaine hauteur avance sans souci sur un escalier. Logiquement si tu utilises RunPlayerMove, ça devrait faire la même chose.
    --- Message fusionné : 21 Juillet 2014 ---
    Faire un mix A* et waypoints seraient probablement pas mal. Du genre tu utilises A* jusqu'à ce que tu sois sans une situaiton de blocage, et tu switches sur les waypoints à partir de de moment là.
    --- Message fusionné : 21 Juillet 2014 ---
    Bah, c'est un module, et si tu fais un peu de caching, ça devrait probablement être pas trop CPUvore.
    --- Message fusionné : 21 Juillet 2014 ---
    Les 3 points sont valides. Tu peux très bien faire les 2 selon un ordre et un timer. 1) il essaye de l'attraper par les pieds, si marche pas 2) il essaye de passer par un autre chemin donné par un waypoint, si marche 3) il passe son chemin.
     
  5. Midori

    Midori Membre

    RunPlayerMove n'est-il pas spécifique aux Joueurs & Bots ou surtout aux Bots ? Est-il possible de l'utiliser pour les entités créées à la main, depuis zéro ?
    (Il me semble avoir vu fakeclient dans les arguments de la fonction, c'est pour ça :LOL: )


    Oui cette solution me semble pas mal, mais après avoir vu ce poste : A* Pathfinding API - Page 2 - AlliedModders
    J'ai plus été réticent sur cette méthode, même si c'est fais via un plugin et que c'est forcément plus long, on ne parle pas de millisecondes mais carrément de secondes pour calculer un chemin.
    Je sais qu'un module va plus vite etc, mais là quand même c'est plutôt chaud le temps que ça met !
    Etant donné que je veux mettre entre 20-30 NPCs qui bougent dans le jeu par eux-même, ça risque d'être tendu du slip.
    Il faudra que j'essaie dans tous les cas.

    Oui cette solution me semble pas mal, après c'est vrai que ce problème fait parti de l'intelligence de l'AI et que je peux faire 1000 autres méthodes pour ça :chicken: 
    --- Message fusionné : 22 Juillet 2014 ---
    Pour revenir à la solution où tu combines A* & Waypoints, en fait je pense que c'est une très bonne idée, et que je devrais utiliser les Waypoints quand la distance est supérieure à une valeur, si la distance est courte, j'utiliserai le A* puisque le chemin à calculer est petit, ça ne devrait vraiment pas prendre beaucoup de temps.

    Je vais mettre tout ça en place quand j'aurais le temps, je testerai les trois méthodes :
    - Seulement A*
    - Seulement Waypoints
    - Mix des deux

    Et je publierai les résultats ici, comme ça on saura ce qui est le mieux :notworthy: 
     

Partager cette page

Chargement...
Chargement...