Generar una malla de navegación en una escena 3DGS
Navigation System Support
Alcance
Este documento va dirigido a las escenas que construyen la navegación a partir de los datos de colisión de LCC, por lo que solo se aplica a ALCCActor y ALCC2Actor: únicamente los formatos .lcc y .lcc2 incluyen datos de colisión; consultar Colisión.
.sog, .spz y .ply no contienen datos de colisión, por lo que las zonas transitables deben construirse manualmente con Blocking Volumes o con una malla aproximada. Esa geometría está formada por objetos estándar de UE, y la navegación se configura mediante el flujo de trabajo oficial de Unreal Engine, que no implica las particularidades de este documento.
Descripción general
El Navigation System de Unreal Engine proporciona zonas transitables para los personajes de IA mediante un NavMesh. La generación del NavMesh depende de que haya en la escena geometría capaz de afectar a la navegación y con colisión válida.
La colisión de LCC se carga dinámicamente por bloques: solo se cargan los bloques de colisión situados dentro de un cierto radio alrededor de la cámara, y se intercambian a medida que la cámara se mueve (para el mecanismo, consultar Colisión: mecanismo de carga). Esto determina directamente la estrategia de configuración de la navegación:
- El intercambio de bloques de colisión en tiempo de ejecución provoca reconstrucciones del NavMesh y produce tirones
- Por tanto, la colisión de la zona de destino debe estar cargada por completo en una sola pasada antes de construir la navegación en modo
Static
Para las escenas LCC, Static es el Runtime Generation recomendado. Dynamic sigue respondiendo a los cambios de colisión y reconstruyendo el NavMesh, lo que, combinado con la colisión cargada por bloques, provoca reconstrucciones frecuentes y un coste de CPU y tirones apreciables en escenas grandes.
Requisitos previos
| Condición | Descripción |
|---|---|
| Los datos contienen un archivo de colisión | .lcc requiere collision.lci (collision.bin en versiones anteriores); .lcc2 requiere los archivos .ply de data/mesh/. Consultar Colisión: requisitos previos |
| La colisión está activada | bEnableCollision = true en el Actor |
| Los datos de colisión están cargados | Seleccionar player collision o visibility collision en el modo de visualización para ver los cuerpos de colisión cargados |
| El Actor puede afectar a la navegación | CanEverAffectNavigation = true en el Actor |
| El radio de carga de colisión es suficiente | Max Load Collision Distance(m) cubre la zona de destino donde se necesita navegación, 300 metros por defecto |
| Los límites de construcción del NavMesh son suficientes | Hay un NavMeshBoundsVolume colocado en la escena y cubre la zona de destino por la que se mueve la IA |
La distancia de carga de colisión y el
NavMeshBoundsVolumecontrolan radios distintos: la primera decide qué zonas tienen datos de colisión, el segundo decide dentro de qué límites construye el motor el NavMesh. Ambos deben cubrir la zona de destino para que se genere allí un NavMesh utilizable.
Pasos
1. Activar y comprobar la colisión LCC
Seleccionar ALCCActor o ALCC2Actor y activar Enable Collision (bEnableCollision) en el panel Details, o activarlo desde código:
LCCComponent->SetLCCCollisionEnable(true);
Al mismo tiempo, confirmar CanEverAffectNavigation = true en el Actor para que su colisión pueda participar en la construcción de la navegación.
Tras cargar los datos LCC, seleccionar player collision o visibility collision en el modo de visualización y comprobar si han aparecido cuerpos de colisión en la zona de destino. La colisión usa horneado de física asíncrono, por lo que todavía puede tardar unos segundos después de que la imagen 3DGS empiece a renderizarse.

Usar el modo player collision o visibility collision para confirmar que los cuerpos de colisión de LCC de la zona de navegación de destino están cargados
2. Configurar el radio de carga de colisión
La colisión de LCC se carga solo dentro del radio indicado por Max Load Collision Distance(m), 300 metros por defecto.
Al usarlo con navegación, aumentar este valor para cubrir toda la zona de actividad de la IA de modo que toda la colisión se cargue en una sola pasada. De lo contrario, los bloques de colisión se intercambian continuamente a medida que la cámara se mueve en tiempo de ejecución, lo que provoca reconstrucciones continuas del NavMesh y tirones apreciables. Con un radio suficientemente amplio no hay cambios de colisión en tiempo de ejecución, por lo que la navegación no se reconstruye nunca.
El coste es un tiempo de carga más largo al inicio y un mayor uso de memoria. Usar Collision Data Usage en stat xgrids para confirmar si la memoria después de una carga completa es aceptable; consultar Colisión: cargar toda la colisión de una vez.
No cambiar Runtime Generation a Dynamic para compensar una distancia de colisión insuficiente. Dynamic no amplía el radio de carga de colisión, y las zonas más allá de esa distancia siguen sin tener colisión disponible para la construcción de la navegación.
3. Colocar y ajustar el NavMeshBoundsVolume
Colocar un NavMeshBoundsVolume en la escena y, a continuación, moverlo y escalarlo para que cubra por completo la zona por la que debe moverse la IA.

Colocar y escalar el NavMeshBoundsVolume para que los límites de construcción de la navegación cubran por completo la zona de actividad de la IA
Confirmar de nuevo que ambos radios cumplen el requisito:
- Max Load Collision Distance(m): decide si existe colisión LCC cargada en la zona de destino.
- NavMeshBoundsVolume: decide dentro de qué límites construye Unreal Engine el NavMesh.
Ampliar solo uno de los dos no resuelve la zona que el otro no llega a cubrir.
4. Configurar el sistema de navegación
| Ajuste | Valor recomendado | Descripción |
|---|---|---|
| Runtime Generation | Static | El ajuste preferido. La navegación se genera solo al construirla en el editor, lo que evita el coste de rendimiento de las reconstrucciones continuas en tiempo de ejecución |
| Cell Size | Predeterminado | Cuanto menor sea el valor, más preciso será el NavMesh, pero mayores serán el tiempo de construcción, la memoria y el coste en tiempo de ejecución |
Cuándo usar Dynamic
Considerar Dynamic solo cuando el NavMesh deba reconstruirse realmente de forma automática a medida que cambia la geometría en tiempo de ejecución, por ejemplo en una escena interactiva donde las zonas transitables cambian durante la partida.
Prestar especial atención al uso de Dynamic junto con la colisión de LCC: la colisión se carga dinámicamente por bloques, y cada intercambio de un bloque de colisión cuenta como un cambio de geometría y provoca una reconstrucción de la navegación, lo que puede generar un coste de CPU y tirones continuos en escenas grandes. Cuando Dynamic sea realmente necesario, aumentar también el radio de carga de colisión para cubrir toda la zona de actividad y que no se produzcan cambios de colisión en tiempo de ejecución.
No activar Dynamic solo para ampliar la distancia de colisión o la cobertura de la navegación.
5. Esperar la colisión y construir el NavMesh estático
Con el modo Static recomendado, seguir este orden:
- Cargar los datos LCC y confirmar que la imagen 3DGS se muestra.
- Esperar a que finalice el horneado asíncrono de la colisión.
- Usar el modo player collision o visibility collision para confirmar que la colisión de la zona de destino está cargada.
- Confirmar que tanto Collision Load Max Distance como el
NavMeshBoundsVolumecubren la zona de destino. - Ejecutar Build → Build Paths desde el menú principal de Unreal Engine.
- Esperar a que finalice la construcción de la navegación.
- Guardar el nivel y los datos de navegación.
Verificación y resolución de problemas
Pulsar P para mostrar el NavMesh en el viewport:
- Zonas verdes: se ha generado un NavMesh transitable;
- Sin zona verde: no se ha generado NavMesh en esa ubicación, comprobar en el orden siguiente.

Pulsar P para verificar el NavMesh; la cobertura verde indica que se han generado datos de navegación transitables en esa zona
Cuando no hay NavMesh verde en la ubicación de destino, comprobar por orden:
- Si los datos contienen colisión: confirmar que se usa
.lcco.lcc2y que el archivo de colisión correspondiente existe en el directorio de datos; los formatos de archivo único no contienen colisión y no pueden usar este flujo de trabajo. - Si la colisión está activada y cargada: confirmar
bEnableCollision = trueyCanEverAffectNavigation = true, y que los cuerpos de colisión de la ubicación de destino son visibles en el modo player collision o visibility collision. - Si el radio de carga de colisión es suficiente: cuando la ubicación de destino queda más allá del radio de carga, aumentar
Max Load Collision Distance(m)y esperar de nuevo a que la colisión esté lista. - Si el NavMeshBoundsVolume cubre la ubicación de destino: mover o escalar el Volume para que los límites de construcción de la navegación cubran por completo la zona de destino.
- Si el NavMesh estático se ha reconstruido: una vez confirmadas la colisión y los radios, ejecutar Build → Build Paths, esperar a que finalice y guardar el nivel y los datos de navegación.
- Pulsar P de nuevo para comprobar la cobertura verde.
Cuando todo lo anterior es correcto pero la generación sigue fallando, revisar con más detalle el Output Log en busca de errores relacionados con Navigation, Recast y la colisión, y confirmar que el nivel actual está guardado.