Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
NavigationMeshGenerator
Deprecato: This class may be changed or removed in future versions.
Eredita: Object
Classe di supporto per la creazione e la cancellazione delle mesh di navigazione.
Descrizione
Questa classe è responsabile della creazione e della cancellazione di mesh di navigazione 3D utilizzate come risorse NavigationMesh all'interno di NavigationRegion3D. NavigationMeshGenerator ha un utilizzo molto limitato o nullo per 2D poiché la preparazione della mesh di navigazione si aspetta tipi di nodi 3D e geometria sorgente 3D da analizzare.
L'intera preparazione della mesh di navigazione è meglio eseguita in un thread separato poiché la voxelizzazione, i test di collisione e l'ottimizzazione della mesh coinvolti sono operazioni molto lente e ad alta intensità di prestazioni.
La preparazione della mesh di navigazione avviene in più passaggi e il risultato dipende dalla geometria sorgente 3D e dalle proprietà della risorsa NavigationMesh. Nel primo passaggio, partendo da un nodo radice e in base alle proprietà NavigationMesh, tutti i nodi validi di geometria sorgente 3D vengono raccolti dal SceneTree. Successivamente, tutti i nodi raccolti vengono analizzati per i loro dati di geometria 3D applicabili e viene creata una mesh 3D combinata. A causa dei molti tipi diversi di oggetti analizzabili, dai normali MeshInstance3D ai CSGShape3D o vari CollisionObject3D, alcune operazioni per raccogliere i dati geometrici possono attivare sincronizzazioni sul RenderingServer e PhysicsServer3D. La sincronizzazione dei server può avere un effetto negativo sul tempo di preparazione o sul frame rate poiché spesso provoca il blocco Mutex per la sicurezza dei thread. Molti oggetti analizzabili e la sincronizzazione continua con altri server con thread possono aumentare significativamente il tempo di preparazione. D'altro canto, solo pochi oggetti molto grandi e complessi impiegheranno tempo per prepararsi per i server, il che può bloccare notevolmente il rendering del frame successivo. Come regola generale, il numero totale di oggetti analizzabili e le loro singole dimensioni e complessità dovrebbero essere bilanciati per evitare problemi di frame rate o tempi di preparazione molto lunghi. La mesh combinata viene quindi passata al Recast Navigation Object per testare la geometria di origine per un terreno percorribile adatto alle proprietà dell'agente NavigationMesh, creando un mondo di voxel attorno all'area di delimitazione delle mesh.
La mesh di navigazione finalizzata viene quindi restituita e archiviata all'interno di NavigationMesh per essere utilizzata come risorsa all'interno dei nodi NavigationRegion3D.
Nota: Utilizzare le mesh non solo per definire superfici percorribili ma anche per ostacolare la preparazione della navigazione non funziona sempre. La preparazione della navigazione non ha idea di cosa sia una geometria "interna" quando si ha a che fare con la geometria sorgente della mesh e questo è intenzionale. A seconda dei parametri attuali di preparazione, non appena la mesh ostruente è abbastanza grande da contenere un'area di mesh di navigazione al suo interno, la preparazione genererà aree di mesh di navigazione che si trovano all'interno della mesh della geometria sorgente ostruente.
Tutorial
Metodi
void |
bake(navigation_mesh: NavigationMesh, root_node: Node) |
void |
bake_from_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, callback: Callable = Callable()) |
void |
clear(navigation_mesh: NavigationMesh) |
void |
parse_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, root_node: Node, callback: Callable = Callable()) |
Descrizioni dei metodi
void bake(navigation_mesh: NavigationMesh, root_node: Node) 🔗
Deprecato: This method is deprecated due to core threading changes. To upgrade existing code, first create a NavigationMeshSourceGeometryData3D resource. Use this resource with parse_source_geometry_data() to parse the SceneTree for nodes that should contribute to the navigation mesh baking. The SceneTree parsing needs to happen on the main thread. After the parsing is finished use the resource with bake_from_source_geometry_data() to bake a navigation mesh.
Precalcola la mesh di navigazione (navigation_mesh) con la geometria sorgente raccolta a partire dal nodo radice (root_node).
void bake_from_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, callback: Callable = Callable()) 🔗
Prepara la mesh di navigazione navigation_mesh con i dati della geometria sorgente source_geometry_data. Una volta terminato il processo, verrà chiamato il callback facoltativo.
void clear(navigation_mesh: NavigationMesh) 🔗
Rimuove tutti i poligoni e i vertici dalla risorsa navigation_mesh fornita.
void parse_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, root_node: Node, callback: Callable = Callable()) 🔗
Analizza il SceneTree per la geometria sorgente in base alle proprietà di navigation_mesh. Aggiorna la risorsa source_geometry_data fornita con i dati risultanti. La risorsa può quindi essere utilizzata per preparare una mesh di navigazione con bake_from_source_geometry_data(). Dopo che il processo è terminato, verrà chiamato il callback facoltativo.
Nota: Questa funzione deve essere eseguita sul thread principale o con una chiamata differita poiché il SceneTree non è sicuro su altri thread.
Prestazioni: Sebbene sia conveniente, leggere gli array di dati dalle risorse Mesh può influire negativamente sul frame rate. I dati devono essere ricevuti dalla GPU, bloccando il RenderingServer nel processo. Per le prestazioni, si preferisce utilizzare, ad esempio, forme di collisione o creare gli array di dati interamente in codice.