Ennemis

Viser et tirer

Pour cela on ne va pas utiliser le script ViserEtTirer, mais plutôt le script PatrouillerEtTirer (on ne lui dira juste pas de Patrouiller)

EnnemiTirer.mp4

Patrouiller

Pour faire patrouiller notre personnage nous allons avoir besoin de plusieurs composants en plus du script.

Tout d'abord nous allons ajouter un composant Animator sur le personnage pour que celui-ci puisse être animé.

Sur notre componnant Animator, nous allons devoir ajouter également un Controller.

Nous allons ici choisir le NavmeshWalk.

Pour définir la trajectoire de la patrouille nous allons ensuite créer des Empty GameObject et les placer aux points endroits où le personnage doit passer. Ces points sont appelés Patrol points ou Waypoint dans les scripts. Le script permet que le personnage avance en ligne droite entre ces deux points.

Pour être reconnus comme Waypoint il faut ajouter le script Waypoint a ces objets.

On voit alors que leur emplacement est entouré des axes d'une sphère rouge comme sur l'exemple ci-contre.

Ajoutons maintenant le script à notre personnage pour y définir les points de passage.

Pour ajouter les Patrol Points, on clique sur la petit flèche puis dans Size on entre le nombre de points de passage (au moins 2 pour une ligne droite).

Ensuite on met chaque GameObject avec le script Waypoint dans un des Element.

Il y a également trois autres paramètres sur le script Patrouille :

  • la case Patrol Waiting permet de définir si le personnage attend entre deux déplacements
  • le Total Wait Time définit le temps d'attente
  • enfin Switch Probability détermine la probabilité que le personnage a de repartir dans le sens inverse. C'est à dire s'il y a au moins 3 patrol points, le trajet normal est 1 -> 2 -> 3 -> 1, le switch probability définit la probabilité que l'ennemi a s'il est au point 2 d'aller au point 1 plutôt qu'au point 3.

Enfin il faut créer les surfaces sur lesquelles notre personnage va pouvoir se déplacer en créant un Nav Mesh.

Nous allons voir en détail comment le créer, mais d'abord on va ajouter le script Nav Mesh Agent à notre personnage pour dire qu'il se déplace sur un Nav Mesh.

Créer le Nav Mesh

Le Nav Mesh correspond à la zone de navigation. Pour la générer et l'éditer nous allons avoir besoin de la fenêtre de Navigation.

Pour l'ouvrir, nous allons aller dans Windows > AI > Navigation.

La fenêtre de navigation s'ouvre alors sur la colonne de droite à coté de l'Inspector.

Deux onglets de la fenêtre de navigation vont nous intéresser particulièrement : l'onglet Agent et l'onglet Bake.

L'onglet Bake permet de créer la zone navigable.

La zone navigable est composée de plusieurs surfaces d'objets statiques. Avant de lancer le Bake on va vérifier que tous les objets sur lesquels on veut naviguer sont bien en mode Static.

Pour qu'un objet soit Static, il faut vérifier que la case Static en haut à droite dans l'Inspector soit cochée.

Pour lancer le bake, il ne reste qu'à aller dans la fenêtre de navigation sur l'onglet Bake et d'appuyer sur Bake.

On remarque alors que si l'option Show NavMesh est activée, la zone navigable apparaît en bleu.


Il ne reste plus qu'a appuyer sur Play et regarder le résultat. Si ça ne fonctionne pas correctement, vérifie que tu as bien réalisé toutes les étapes précédentes !

Barbare en patrouille

Ajouter des obstacles, des marches, des sauts et des pentes

Les obstacles

Si on souhaite rajouter des obstacles sur la trajectoire de notre ennemi, il suffit de les rajouter sur la trajectoire entre les différents Waypoint, de vérifier que les objets sont bien Static et de faire Bake à nouveau.

On voit alors qu'une zone blanche entoure l'objet et que celui-ci est gris. Ces zones ne sont désormais plus navigables et n'apparaissent plus en bleu.

Si on lance le jeu on voit bien que notre personnage évite les obstacles et les contourne

Barbare qui évite les obstacles

Monter sur un obstacle

Dans l'outil Navigation il y a plusieurs outils intéressants.

L'outil Step Height permet de définir les hauteurs de marches qui peuvent être franchies.

Cet outil est présent à la fois dans l'onglet Bake pour les hauteurs de marches que le NavMesh supportera, et dans l'onglet Agents, pour définir les marches que notre personnage peut monter. Si la Step Height du personnage est plus faible que celle du NavMesh alors il y a certaines marches qui apparaîtrons en bleu sur le NavMesh mais que le personnage ne pourra pas franchir.

Ci dessus on peut voir les différents endroits ou l'on peut régler la Step Height ainsi que le rendu d'une marche franchissable.

Barbare qui monte une marche

Les autres outils

De la même manière que pour l'outil Step Height, on peut utiliser les outils suivants, qui sont à la fois définis sur l'onglet Build et sur l'onglet Agent :

  • l'outil Max Slope qui définit les pentes qui peuvent être escaladées
  • l'outil Height qui définit la hauteur des personnages
  • l'outil Width qui définit la largeur des personnages

Enfin sur l'onglet Build on a deux autres outils :

  • l'outil Drop Height qui définit la hauteur qu'un personnage peut descendre en sautant
  • l'outil Jump Distance qui définit la distance qu'un personnage peut sauter horizontalement (au dessus d'un trou par exemple)

Sur cette image on peut voir les zones navigables. On voit que la pente est reconnue, et qu'on a de nombreux cercles avec des flèches.

Au niveau des marches c'est l'illustration du Drop Height qui indique qu'on peut sauter.

De même au niveau du trou entre les deux plateformes qui illustrent le Jump Distance.

Voici quelques exemples utilisant ces différents outils:

Barbare qui escalade une paroi et saute un obstacle

Barbare qui saute d'une plateforme a une autre (pour avoir un super effet il faudra penser à programmer son animation)

Ajouter des obstacles qui se déplacent

Jusqu'à présent pour détecter les objets appartenant au NavMesh, on les fixait comme static.

Il est également possible d'avoir des obstacles qui se déplacent. Pour cela nous n'allons pas les fixer comme static, mais ajouter à notre obstacle le component Nav Mesh Obstacle.

Pour que le calcul de la trajectoire prenne en compte en avance le déplacement des objets, on va cocher la case Carve et décocher la case Carve Only Stationary.

Si on ne coche pas la case Carve le personnage ajustera sa trajectoire uniquement quand il entre en collision avec un objet.

Si l'on ne choisit pas le mode Carve, il est possible de modifier la distance à partir de laquelle le personnage détecte l'objet.

Pour cela il suffit d'aller sur le component Nav Mesh Agent de notre personnage et de modifier le Radius dans Obstacle Avoidance.

Si l'on est en mode Carve, on peut vérifier que la NavMesh évolue en fonction du déplacement de l'objet.

Pour avoir cette vue, appuie sur Play puis clique sur le bouton Guizmos en haut à droite de l'écran et mets toi dans la fenêtre Navigation sur la droite.

Et voilà notre barbare évite les objets qui se déplacent.