Voici une vidéo explicative sur le NavMesh et son utilisation. Tu trouveras le détails de cette vidéo ci-après.
Un NavMesh c’est un composant un peu spécial d’unity qui permet de créer des zones navigables. L’importance du NavMesh vient quand on veut faire des ennemis ou des personnages avec un minimum d’intelligence, qui doivent se déplacer en évitant des obstacles.
Par défaut Unity à son propre system de NavMesh, mais celui-ci ne fonctionne pas en 2D
Pas de panique cependant car il existe un package qui permet de faire la même chose (voir mieux!) en 2D!
Un NavMesh ça fonctionne avec une grille.
Chaque case de la grille contient un petit morceau du décor. Ce petit morceau va être classé navigable ou non-navigable selon les paramètres que l’on aura donné à l’IA.
Puis notre IA va rassembler toutes ces cases pour se faire une carte dans sa tête, de la ou elle peut aller et la ou elle ne peut pas aller.
Plus les cases sont petites et nombreuses, plus les calculs seront précis, mais plus ils prendront du temps et de la puissance de l’ordinateur.
Avant toute chose, il te faudra le package! Ce dernier ne se trouve pas dans le package Manager comme la plupart des packages, mais tu peux le télécharger ici:
La version gratuite est la bonne bien sûr.
Une fois téléchargé, tu vas tirer le package dans les dossiers de ton projet, dans la fenêtre d’unity.
Tu peux aussi passer par le menu Assets > Import Package:
Dans tous les cas, tu valide l’importation et tu laisse faire Unity.
Maintenant que le package est installé, on va pouvoir l’utiliser.
Et tu va voir que c’est en fait assez simple (même si les composants vont faire un peu peur au début)
On va commencer par choisir un objet qui servira de Manager pour nos IA.
Sur cet objet, on va ajouter un composant qui s’appelle: Pathfinder.
Ce dernier va tracer une grille qui va couvrir notre niveau et permettre à nos IA de choisir leurs chemins et détecter les obstacles.
Quand on l’ajoute ça fait beaucoup de paramètres mais pas de panique! On va avoir besoin d’en modifier en fait très peu!
On ajoute d’abord un grid si il n’y en a pas. Et on ajuste les paramètres.
Quand on a fini on descend un peu.
Dans les settings on peut aussi désactiver les Logs (pour éviter d’avoir du spam dans la console, vu que la grille nous envoi un message dès que quelque chose se passe, même minime)
Et enfin on utilise le bouton Scan pour générer les zones navigables.
Ces dernières apparaissent en bleu, et les obstacles avec des petits carrés rouges.
Cette étape là est aussi super facile, car le package A*Pathfinding contient des composants pré-fait!
On va donc soit créer un nouvel ennemi. Soit se mettre sur un ennemis existant que l’on veut faire bouger. On va lui donner les composants suivant:
Le premier composant c’est les jambes. C’est ce qui fait que l’IA analyse les zones navigables et se déplace dans ces dernières. (vous allez voir que ce composant ajoute aussi un script automatiquement, qui s’appelle seeker, c’est normal, c’est le “cerveau” de l’IA, on a jamais besoin d’y toucher)
Le 2e script est bien plus simple, c’est la cible de l’IA.
Notre IA est prête à fonctionner!
Bien sûr, l’IA juste au-dessus n’est pas idéale, car elle va fonctionner dès le début et donc détecter le joueur qu’importe la distance à laquelle il est. Et lui foncer dessus tout de suite.
Si on veut on peut donc changer un peu les choses, en ajoutant un script à nous, pour dire à l’IA de ne voir le joueur que s’ il s’approche suffisamment d’elle:
public class LocateSiProche : MonoBehaviour
{
//On met une variable pour le composant de ciblage
public AIDestinationSetter destination;
//On met une variable pour la distance à laquelle l’IA nous localise
public float distance_detection;
void Update()
{
//On calcule la distance entre la cible et l’IA. Si c’est moins que la distance de detection
if (Vector2.Distance(destination.target.position, transform.position) < distance_detection) {
//Alors le script de ciblage s’active
destination.enabled = true;
}
else {
//sinon il se désactive et l’IA arrête de nous chercher
destination.enabled = false;
}
}
}
Que fait-on si un de nos obstacles est amovible?
Car la grille de notre IA est calculée avant de lancer le jeu. Hors si notre obstacle bouge, notre IA, elle, ne le sait pas. Elle ne verra donc pas l’obstacle à sa nouvelle place, mais à son ancienne!
Pour éviter ça, on peut ajouter un composant à tous les obstacles qui doivent bouger pendant le jeu:
Dynamic Grid Obstacle
Il ne contient qu’un seul paramètre qui nous intéresse: le check time.
C’est le temps entre deux mises à jour de la grille.
Si notre obstacle bouge vite, il est bon de mettre une petite valeur. Mais attention, plus la valeur est petite, plus l’ordinateur devra faire de calculs!