Navigation en Temps Réel (3D)

Introduction

La recherche de chemin dans un environnement 3D est cruciale pour de nombreux jeux, c'est généralement la façon dont les personnages ou les entités non contrôlés directement s'orientent dans un environnement. Godot fournit plusieurs nœuds à cette fin :

La carte et les régions de navigation

La "carte" est le monde entier pour la navigation, elle est similaire à "l'espace" pour le moteur physique. Elle est composée de régions de navigation, ces régions définissent des parties du monde dans lesquelles les agents de navigation peuvent se déplacer.

Pour créer une région de navigation, ajoutez le nœud NavigationMeshInstance à une scène 3D. Ensuite, dans l'inspecteur de ce maillage, créez ou ajoutez un NavigationMesh. Le navmesh contient des options sur la façon dont il sera généré après avoir été précalculé. Les options de géométrie contrôlent quels noeuds, et quels types de noeuds, sont utilisés pour précalculer le maillage. Une description complète de chaque paramètre et de son fonctionnement se trouve dans la Référence de la classe NavigationMesh.

Une fois les paramètres correctement configurés, cliquez sur le bouton "Bake NavMesh" en haut de l'inspecteur pour le générer.

../../_images/bake_navmesh.png

Note

Il peut également être généré au moment de l'exécution à l'aide de la méthode bake_navigation_region() du nœud de région de navigation.

Une fois la génération du maillage terminée, vous devriez voir le maillage de navigation transparent au-dessus des zones de votre scène dans lesquelles vous pouvez naviguer.

../../_images/baked_navmesh.png

Gardez à l'esprit que le maillage de navigation indique où le centre d'une entité peut aller. Par exemple, si vous définissez le rayon de l'agent à 0,5, votre maillage de navigation sera à une distance de 0,5 de tout rebord ou mur afin d'éviter de clip dans un mur ou de se suspendre au bord.

Les agents de navigation peuvent être déplacés d'une région à l'autre s'ils se trouvent l'un à côté de l'autre. En outre, un navmesh précalculé peut être déplacé au moment de l'exécution et les agents pourront toujours s'y rendre depuis une autre région. Par exemple, la navigation sur une plate-forme mobile qui s'est arrêtée fonctionnera.

Traitement RVO

RVO est l'acronyme de "reciprocal velocity obstacle". Le traitement RVO est un moyen de trouver un chemin en tenant compte des autres agents et des corps physiques qui se déplacent également.

Pour l'utiliser, il faut définir une cible. Ensuite, un agent doit récupérer le prochain emplacement de son chemin de navigation, et calculer sa vélocité jusqu'à cet emplacement. Au lieu d'utiliser cette valeur pour se déplacer, utilisez-la pour définir la vélocité de l'agent avec set_velocity. Ensuite, une nouvelle vitesse qui prend en compte les autres agents et les obstacles est générée et émise avec le signal velocity_computed.

Cependant, les agents ne peuvent prendre en compte qu'un nombre déterminé d'autres agents à proximité, c'est la propriété max neighbors d'un agent et elle peut être ajustée. Ce n'est pas une limite définissant le nombre d'agents pouvant utiliser une région de navigation en même temps.

Génération d'un chemin (ancienne méthode)

Il s'agit de l'ancienne méthode pour générer un chemin de navigation, elle sera supprimée dans Godot 4. Tout d'abord, ajoutez un nœud de navigation à la scène, puis ajoutez une instance de maillage de navigation comme enfant et configurez un maillage de navigation.

Pour obtenir un chemin entre deux zones sur une carte, vous utilisez la méthode du noeud de navigation get_simple_path(). Le premier argument est un Vector3 de l'emplacement de départ, le suivant est un Vector3 de l'emplacement d'arrivée. Et le dernier argument est un booléen qui indique si les propriétés de l'agent d'un navmesh sont prises en compte ou non lors de la génération d'un chemin.

La méthode retournera un PoolVector3Array constitué de points qui forment un chemin. S'il n'y a aucun moyen de naviguer jusqu'à l'emplacement final, la méthode renverra un PoolVector3Array vide.