Generare una mesh di navigazione in una scena 3DGS
Navigation System Support
Ambito
Questo documento riguarda le scene che costruiscono la navigazione dai dati di collisione LCC, quindi si applica solo a ALCCActor e ALCC2Actor: solo i formati .lcc e .lcc2 includono dati di collisione, vedere Collisioni.
.sog, .spz e .ply non contengono dati di collisione, quindi le aree percorribili devono essere costruite manualmente con Blocking Volume o una mesh approssimata. Tale geometria è composta da oggetti UE standard, e la navigazione si configura attraverso il flusso di lavoro ufficiale di Unreal Engine, che non riguarda le specificità di questo documento.
Panoramica
Il Navigation System di Unreal Engine fornisce aree percorribili ai personaggi IA attraverso una NavMesh. La generazione della NavMesh si basa su geometria presente nella scena che può influire sulla navigazione e che ha collisioni valide.
Le collisioni LCC vengono caricate dinamicamente a blocchi: vengono caricati solo i blocchi di collisione entro una certa distanza dalla camera, e vengono scambiati dentro e fuori al movimento della camera (per il meccanismo, vedere Collisioni: meccanismo di caricamento). Questo determina direttamente la strategia di configurazione della navigazione:
- Lo scambio dei blocchi di collisione a runtime innesca ricostruzioni della NavMesh e provoca scatti
- Le collisioni dell'area di destinazione dovrebbero quindi essere completamente caricate in un solo passaggio prima di costruire la navigazione in modalità
Static
Per le scene LCC, Static è la Runtime Generation consigliata. Dynamic continua a rispondere alle variazioni delle collisioni e a ricostruire la NavMesh, il che unito alle collisioni caricate a blocchi innesca ricostruzioni frequenti e provoca costi CPU e scatti evidenti nelle grandi scene.
Prerequisiti
| Condizione | Descrizione |
|---|---|
| I dati contengono un file di collisione | .lcc richiede collision.lci (collision.bin nelle versioni precedenti); .lcc2 richiede i file .ply in data/mesh/. Vedere Collisioni: prerequisiti |
| Le collisioni sono abilitate | bEnableCollision = true sull'Actor |
| I dati di collisione sono caricati | Selezionare player collision o visibility collision nella modalità di visualizzazione per vedere i corpi di collisione caricati |
| L'Actor può influire sulla navigazione | CanEverAffectNavigation = true sull'Actor |
| L'estensione di caricamento delle collisioni è sufficiente | Max Load Collision Distance(m) copre l'area di destinazione in cui serve la navigazione, 300 metri per impostazione predefinita |
| I limiti di costruzione della NavMesh sono sufficienti | Un NavMeshBoundsVolume è posizionato nella scena e copre l'area di destinazione in cui si muove l'IA |
La distanza di caricamento delle collisioni e
NavMeshBoundsVolumecontrollano estensioni differenti: la prima decide quali aree hanno dati di collisione, il secondo decide entro quali limiti il motore costruisce la NavMesh. Entrambi devono coprire l'area di destinazione perché venga generata una NavMesh utilizzabile in quel punto.
Procedura
1. Abilitare e controllare le collisioni LCC
Selezionare ALCCActor o ALCC2Actor e abilitare Enable Collision (bEnableCollision) nel pannello Details, oppure abilitarlo da codice:
LCCComponent->SetLCCCollisionEnable(true);
Allo stesso tempo verificare che CanEverAffectNavigation = true sull'Actor, così che le sue collisioni possano partecipare alla costruzione della navigazione.
Dopo il caricamento dei dati LCC, selezionare player collision o visibility collision nella modalità di visualizzazione e controllare se i corpi di collisione sono comparsi nell'area di destinazione. Le collisioni usano il baking fisico asincrono, quindi possono richiedere ancora alcuni secondi dopo l'inizio del rendering dell'immagine 3DGS.

Uso della modalità player collision o visibility collision per verificare che i corpi di collisione LCC nell'area di navigazione di destinazione siano caricati
2. Configurare l'estensione di caricamento delle collisioni
Le collisioni LCC vengono caricate solo entro l'estensione indicata da Max Load Collision Distance(m), 300 metri per impostazione predefinita.
Quando si usa la navigazione, aumentare questo valore per coprire l'intera area di attività dell'IA così che tutte le collisioni vengano caricate in un solo passaggio. Altrimenti i blocchi di collisione continuano a essere scambiati dentro e fuori al movimento della camera a runtime, il che innesca continuamente ricostruzioni della NavMesh e provoca scatti evidenti. Con un'estensione abbastanza grande non ci sono variazioni delle collisioni a runtime, quindi la navigazione non viene mai ricostruita.
Il costo è un tempo di caricamento più lungo all'avvio e un uso di memoria maggiore. Usare Collision Data Usage in stat xgrids per verificare se la memoria dopo un caricamento completo è accettabile, vedere Collisioni: caricare tutte le collisioni in una volta.
Non cambiare Runtime Generation in Dynamic per aggirare una distanza di collisione insufficiente. Dynamic non estende l'estensione di caricamento delle collisioni, e le aree oltre quella distanza restano prive di collisioni disponibili per la costruzione della navigazione.
3. Posizionare e regolare il NavMeshBoundsVolume
Posizionare un NavMeshBoundsVolume nella scena, quindi spostarlo e scalarlo per coprire l'intera area in cui l'IA deve muoversi.

Posizionamento e scalatura del NavMeshBoundsVolume così che i limiti di costruzione della navigazione coprano l'intera area di attività dell'IA
Verificare di nuovo che entrambe le estensioni soddisfino il requisito:
- Max Load Collision Distance(m): decide se nell'area di destinazione esistono collisioni LCC caricate.
- NavMeshBoundsVolume: decide entro quali limiti Unreal Engine costruisce la NavMesh.
Estendere solo uno dei due non risolve l'area che l'altro non riesce a coprire.
4. Configurare il Navigation System
| Impostazione | Valore consigliato | Descrizione |
|---|---|---|
| Runtime Generation | Static | L'impostazione preferibile. La navigazione viene generata solo quando la si costruisce nell'editor, evitando il costo di prestazione delle ricostruzioni continue a runtime |
| Cell Size | Predefinito | Più piccolo è il valore, più accurata è la NavMesh, ma più alti sono tempo di costruzione, memoria e costo a runtime |
Quando usare Dynamic
Considerare Dynamic solo quando la NavMesh deve davvero ricostruirsi automaticamente al variare della geometria a runtime, per esempio in una scena interattiva in cui le aree percorribili cambiano durante il gioco.
Fare particolare attenzione a Dynamic insieme alle collisioni LCC: le collisioni stesse vengono caricate dinamicamente a blocchi, e ogni scambio di un blocco di collisione conta come variazione della geometria e innesca una ricostruzione della navigazione, il che può produrre costi CPU e scatti continui nelle grandi scene. Quando Dynamic serve davvero, aumentare anche l'estensione di caricamento delle collisioni per coprire l'intera area di attività, così da non avere variazioni delle collisioni a runtime.
Non abilitare Dynamic solo per estendere la distanza di collisione o la copertura della navigazione.
5. Attendere le collisioni e costruire la NavMesh statica
Con la modalità Static consigliata, seguire questo ordine:
- Caricare i dati LCC e verificare che l'immagine 3DGS sia visualizzata.
- Attendere la fine del baking asincrono delle collisioni.
- Usare la modalità player collision o visibility collision per verificare che le collisioni nell'area di destinazione siano caricate.
- Verificare che sia Collision Load Max Distance sia
NavMeshBoundsVolumecoprano l'area di destinazione. - Eseguire Build → Build Paths dal menu principale di Unreal Engine.
- Attendere la fine della costruzione della navigazione.
- Salvare il livello e i dati di navigazione.
Verifica e risoluzione dei problemi
Premere P per mostrare la NavMesh nel viewport:
- Aree verdi: è stata generata una NavMesh percorribile;
- Nessuna area verde: nessuna NavMesh è stata generata in quel punto, controllare nell'ordine seguente.

Pressione di P per verificare la NavMesh; la copertura verde indica che in quell'area sono stati generati dati di navigazione percorribili
Quando nel punto di destinazione non c'è NavMesh verde, controllare in ordine:
- Se i dati contengono collisioni: verificare che si usi
.lcco.lcc2e che il file di collisione corrispondente esista nella directory dei dati; i formati a file singolo non contengono collisioni e non possono usare questo flusso di lavoro. - Se le collisioni sono abilitate e caricate: verificare che
bEnableCollision = trueeCanEverAffectNavigation = true, e che i corpi di collisione nel punto di destinazione siano visibili nella modalità player collision o visibility collision. - Se l'estensione di caricamento delle collisioni è sufficiente: quando il punto di destinazione è oltre l'estensione di caricamento, aumentare
Max Load Collision Distance(m)e attendere di nuovo che le collisioni siano pronte. - Se il NavMeshBoundsVolume copre il punto di destinazione: spostare o scalare il Volume così che i limiti di costruzione della navigazione coprano completamente l'area di destinazione.
- Se la NavMesh statica è stata ricostruita: una volta verificate collisioni ed estensioni, eseguire Build → Build Paths, attenderne la fine e salvare il livello e i dati di navigazione.
- Premere di nuovo P per controllare la copertura verde.
Quando tutto quanto sopra è corretto ma la generazione continua a non riuscire, controllare ulteriormente nell'Output Log gli errori relativi a Navigation, Recast e collisioni, e verificare che il livello corrente sia salvato.