Générer un maillage de navigation dans une scène 3DGS
Navigation System Support
Portée
Ce document concerne les scènes qui construisent la navigation à partir des données de collision LCC : il ne s'applique donc qu'à ALCCActor et ALCC2Actor, car seuls les formats .lcc et .lcc2 embarquent des données de collision. Voir Collision.
.sog, .spz et .ply ne contiennent pas de données de collision : les zones praticables doivent être construites vous-même avec un Blocking Volume ou un maillage approximatif. Ces géométries sont des objets UE standards et la configuration de la navigation suit le flux officiel d'Unreal Engine, sans les particularités décrites ici.
Vue d'ensemble
Le Navigation System d'Unreal Engine fournit les zones praticables aux personnages IA via le NavMesh. La génération du NavMesh dépend de la présence, dans la scène, de géométries pouvant influer sur la navigation et disposant d'une collision valide.
La collision LCC est chargée dynamiquement par blocs : seuls les blocs de collision situés dans une certaine distance autour de la caméra sont chargés, et ils sont échangés au fil des déplacements de la caméra (mécanisme détaillé dans Collision : mécanisme de chargement). Ce point détermine directement la stratégie de configuration de la navigation :
- L'échange des blocs de collision à l'exécution déclenche la reconstruction du NavMesh et provoque des saccades
- Il faut donc faire en sorte que la collision de la zone cible soit entièrement chargée d'un coup, puis construire la navigation en mode
Static
Pour les scènes LCC, il est recommandé de régler Runtime Generation sur Static. Dynamic réagit en continu aux changements de collision et reconstruit le NavMesh ; associé à une collision chargée par blocs, il déclenche des reconstructions fréquentes, ce qui engendre un coût CPU et des saccades nettes dans les grandes scènes.
Prérequis
| Condition | Description |
|---|---|
| Les données contiennent un fichier de collision | .lcc nécessite collision.lci (collision.bin dans les anciennes versions) ; .lcc2 nécessite les fichiers .ply dans data/mesh/. Voir Collision : prérequis |
| La collision est activée | bEnableCollision = true sur l'Actor |
| Les données de collision sont chargées | En choisissant la collision joueur ou la collision de visibilité dans le mode d'affichage, les corps de collision chargés sont visibles |
| L'Actor peut influer sur la navigation | CanEverAffectNavigation = true sur l'Actor |
| La portée de chargement de la collision est suffisante | Max Load Collision Distance(m) couvre la zone cible pour laquelle la navigation doit être construite, 300 mètres par défaut |
| Les limites de construction du NavMesh sont suffisantes | Un NavMeshBoundsVolume est placé dans la scène et couvre la zone cible d'activité de l'IA |
La distance de chargement de la collision et le
NavMeshBoundsVolumecontrôlent deux portées différentes : la première détermine quelles zones disposent de données de collision, le second détermine dans quelles limites le moteur construit le NavMesh. Pour qu'un NavMesh utilisable soit généré sur la zone cible, les deux doivent couvrir cette zone.
Étapes
1. Activer et vérifier la collision LCC
Sélectionnez un ALCCActor ou un ALCC2Actor et activez Enable Collision (bEnableCollision) dans le panneau Details, ou activez-la par code :
LCCComponent->SetLCCCollisionEnable(true);
Confirmez en même temps que CanEverAffectNavigation = true sur l'Actor, afin que sa collision puisse participer à la construction de la navigation.
Après le chargement des données LCC, choisissez la collision joueur ou la collision de visibilité dans le mode d'affichage et vérifiez que des corps de collision sont bien apparus dans la zone cible. La collision utilise un bake physique asynchrone : quelques secondes d'attente peuvent encore être nécessaires après le début du rendu de l'image 3DGS.

Avec le mode collision joueur ou collision de visibilité, confirmez que les corps de collision LCC de la zone de navigation cible sont chargés
2. Configurer la portée de chargement de la collision
La collision LCC n'est chargée que dans la portée indiquée par Max Load Collision Distance(m), 300 mètres par défaut.
Avec la navigation, augmentez cette valeur pour couvrir toute la zone d'activité de l'IA et charger la collision d'un coup. Sinon, les blocs de collision sont échangés en continu à l'exécution au fil des déplacements de la caméra, ce qui déclenche des reconstructions répétées du NavMesh et des saccades marquées. Quand la portée est suffisamment grande, il n'y a plus de changement de collision à l'exécution et la navigation n'est plus reconstruite.
Le coût est un temps de chargement plus long au démarrage et une occupation mémoire accrue. Collision Data Usage dans stat xgrids permet de vérifier que la mémoire après chargement complet reste acceptable ; voir Collision : charger toute la collision d'un coup.
Ne passez pas Runtime Generation en Dynamic pour compenser une distance de collision insuffisante. Dynamic n'étend pas la portée de chargement de la collision, et les zones au-delà de cette distance n'ont toujours pas de collision utilisable pour la construction de la navigation.
3. Placer et ajuster le NavMeshBoundsVolume
Placez un NavMeshBoundsVolume dans la scène, puis déplacez-le et redimensionnez-le pour qu'il couvre l'intégralité de la zone où l'IA doit évoluer.

Placez et redimensionnez le NavMeshBoundsVolume pour que les limites de construction de la navigation couvrent toute la zone d'activité de l'IA
Vérifiez de nouveau que les deux portées satisfont simultanément aux exigences :
- Max Load Collision Distance(m) : détermine la présence d'une collision LCC chargée dans la zone cible ;
- NavMeshBoundsVolume : détermine dans quelles limites Unreal Engine construit le NavMesh.
Augmenter une seule des deux portées ne suffit pas à résoudre le défaut de couverture de l'autre.
4. Configurer le Navigation System
| Réglage | Valeur recommandée | Description |
|---|---|---|
| Runtime Generation | Static | Réglage à privilégier. La navigation n'est générée qu'à la construction dans l'éditeur, ce qui évite le coût des reconstructions continues à l'exécution |
| Cell Size | Valeur par défaut | Plus la valeur est petite, plus le NavMesh est précis, mais plus le temps de construction, la mémoire et le coût à l'exécution augmentent |
Quand utiliser Dynamic
N'envisagez Dynamic que si le NavMesh doit réellement être reconstruit automatiquement à l'exécution en fonction des changements de géométrie, par exemple dans une scène interactive où les zones praticables changent à l'exécution.
Utiliser Dynamic avec la collision LCC demande une prudence particulière : la collision étant elle-même chargée dynamiquement par blocs, chaque échange de bloc est interprété comme un changement de géométrie et déclenche une reconstruction de la navigation, ce qui peut générer un coût CPU et des saccades continus dans les grandes scènes. Si Dynamic est vraiment nécessaire, augmentez en même temps la portée de chargement de la collision pour couvrir toute la zone d'activité et éviter tout changement de collision à l'exécution.
N'activez pas Dynamic dans le seul but d'augmenter la distance de collision ou la couverture de la navigation.
5. Attendre que la collision soit prête et construire le NavMesh Static
Avec le mode Static recommandé, procédez dans cet ordre :
- Chargez les données LCC et confirmez que l'image 3DGS s'affiche ;
- Attendez la fin du bake asynchrone de la collision ;
- Avec le mode collision joueur ou collision de visibilité, confirmez que la collision de la zone cible est chargée ;
- Confirmez que Collision Load Max Distance et le
NavMeshBoundsVolumecouvrent tous deux la zone cible ; - Exécutez Build → Build Paths dans le menu principal d'Unreal Engine ;
- Attendez la fin de la construction de la navigation ;
- Sauvegardez le niveau et les données de navigation.
Vérification et dépannage
Appuyez sur P pour afficher le NavMesh dans le viewport :
- Zones vertes : un NavMesh praticable a été généré ;
- Absence de zone verte : aucun NavMesh n'a été généré à cet endroit, procédez au dépannage dans l'ordre ci-dessous.

Vérification du NavMesh avec la touche P ; une couverture verte indique que des données de navigation praticables ont été générées sur la zone
Si aucun NavMesh vert n'apparaît à l'emplacement visé, vérifiez dans l'ordre :
- Les données contiennent-elles une collision : confirmez qu'il s'agit bien de
.lccou.lcc2et que le fichier de collision correspondant est présent dans le répertoire de données ; les formats à fichier unique n'ont pas de collision et ne peuvent pas suivre ce flux ; - La collision est-elle activée et chargée : confirmez
bEnableCollision = trueetCanEverAffectNavigation = true, et vérifiez la présence du corps de collision à l'emplacement visé en mode collision joueur ou collision de visibilité ; - La portée de chargement de la collision est-elle suffisante : si l'emplacement visé est hors de la portée de chargement, augmentez
Max Load Collision Distance(m)et attendez que la collision soit de nouveau prête ; - Le NavMeshBoundsVolume couvre-t-il l'emplacement visé : déplacez ou redimensionnez le Volume pour que les limites de construction de la navigation couvrent entièrement la zone cible ;
- Le NavMesh Static a-t-il été reconstruit : une fois la collision et les portées vérifiées, exécutez Build → Build Paths, attendez la fin, puis sauvegardez le niveau et les données de navigation ;
- Appuyez de nouveau sur P pour contrôler la couverture verte.
Si tout ce qui précède est correct et que la génération échoue toujours, examinez les erreurs liées à Navigation, Recast et à la collision dans l'Output Log, et confirmez que le niveau courant a bien été sauvegardé.