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.

Utilizzo degli NavigationObstacle

Le versioni 2D e 3D dei nodi NavigationObstacle sono disponibili rispettivamente come NavigationObstacle2D e NavigationObstacle3D.

Gli ostacoli alla navigazione hanno un duplice scopo, in quanto possono influenzare sia la preparazione delle mesh di navigazione sia l'evitamento degli agenti.

  • Con affect_navigation_mesh abilitato, l'ostacolo influenzerà la mesh di navigazione quando preparato.

  • Con avoidance_enabled l'ostacolo influenzerà gli agenti di evitamento.

Suggerimento

L'evitamento è abilitato come predefinito. Se l'ostacolo non è utilizzato per l'evitamento, disabilitare enabled_avoidance per risparmiare sulle prestazioni.

Mesh di navigazione e ostacoli

Ostacoli di navigazione che influenzano la preparazione delle mesh di navigazione

Ostacoli di navigazione che influenzano la preparazione delle mesh di navigazione.

Per la preparazione delle mesh di navigazione, gli ostacoli si possono usare per scartare parti di tutta l'altra geometria sorgente all'interno della forma dell'ostacolo.

Questo può servire per impedire che le mesh di navigazione siano aggiunte in punti indesiderati, ad esempio all'interno di geometrie "solide" come muri spessi o sopra altre geometrie che non dovrebbero essere incluse nel gameplay, come i tetti.

Gli ostacoli di navigazione scartano le parti indesiderate delle mesh di navigazione

Gli ostacoli di navigazione scartano le parti indesiderate delle mesh di navigazione.

Un ostacolo non aggiunge geometria al processo di preparazione, la rimuove solo. Lo fa annullando tutte le celle (voxel) con geometria sorgente rasterizzata che si trovano all'interno della forma dell'ostacolo. Pertanto, il suo effetto e il dettaglio della forma sono limitati alla risoluzione delle celle utilizzata dal processo di preparazione.

Per maggiori dettagli sulla preparazione delle mesh di navigazione, consultare Utilizzo di mesh di navigazione.

../../_images/nav_mesh_obstacles_properties.webp

La proprietà affect_navigation_mesh fa contribuire l'ostacolo alla preparazione delle mesh di navigazione. Verrà analizzato, o meno, come tutti gli altri oggetti nodo in un processo di preparazione delle mesh di navigazione.

La proprietà carve_navigation_mesh fa sì che la forma non venga influenzata dagli offset della preparazione, ad esempio l'offset aggiunto dal agent_radius di un mesh di navigazione. Fungerà sostanzialmente da stencil e taglierà la superficie di una mesh di navigazione già con un offset. Sarà comunque influenzata dalla post-elaborazione nella preparazione, come la semplificazione dei bordi.

La forma e la posizione dell'ostacolo sono definite dalle proprietà height e vertices, e dalla global_position dell'ostacolo. Il valore dell'asse y di qualsiasi Vector3 utilizzato per i vertici è ignorato poiché l'ostacolo è proiettato su un piano orizzontale piatto.

Durante la preparazione delle mesh di navigazione negli script, è possibile aggiungere gli ostacoli proceduralmente come ostruzioni proiettate. Gli ostacoli non sono coinvolti nell'analisi della geometria sorgente, quindi aggiungerli appena prima della preparazione è sufficiente.

var obstacle_outline = PackedVector2Array([
    Vector2(-50, -50),
    Vector2(50, -50),
    Vector2(50, 50),
    Vector2(-50, 50)
])

var navigation_mesh = NavigationPolygon.new()
var source_geometry = NavigationMeshSourceGeometryData2D.new()

NavigationServer2D.parse_source_geometry_data(navigation_mesh, source_geometry, $MyTestRootNode)

var obstacle_carve: bool = true

source_geometry.add_projected_obstruction(obstacle_outline, obstacle_carve)

NavigationServer2D.bake_from_source_geometry_data(navigation_mesh, source_geometry)

Ostacoli ed evitamento degli agenti

Per l'evitamento, è possibile utilizzare gli ostacoli di navigazione come ostacoli statici o dinamici per influenzare gli agenti controllati dall'evitamento.

  • Se utilizzati staticamente, gli ostacoli di navigazione limitano gli agenti controllati dall'evitamento fuori o dentro un'area definita da un poligono.

  • Se utilizzati dinamicamente, gli ostacoli alla navigazione allontanano gli agenti controllati dall'evitamento in un raggio attorno a loro.

Ostacoli di evitamento statici

Un ostacolo evitabile è considerato statico quando la sua proprietà vertices è popolata con un array di posizioni per formare un poligono.

Ostacolo statico disegnato nell'editor per bloccare o contenere gli agenti di navigazione

Ostacolo statico disegnato nell'editor per bloccare o contenere gli agenti di navigazione.

  • Gli ostacoli statici agiscono come limiti rigidi da non oltrepassare per gli agenti usanti l'evitamento, ad esempio in modo simile alle collisioni fisiche, ma per l'evitamento.

  • Gli ostacoli statici definiscono i propri confini con una serie di vertices (posizioni) di contorno e, nel caso del 3D, con una proprietà height in più.

  • Gli ostacoli statici funzionano solo per gli agenti che utilizzano la modalità di evitamento 2D.

  • Gli ostacoli statici definiscono, attraverso l'ordine di avvolgimento dei vertici, se gli agenti sono spinti all'esterno o risucchiati all'interno.

  • Gli ostacoli statici non possono cambiare le loro posizioni. Si possono solo deformare in una nuova posizione e ricostruire da zero. Pertanto, gli ostacoli statici sono inadatti a utilizzi in cui la posizione cambia a ogni frame, poiché la ricostruzione continua ha un elevato impatto sulle prestazioni.

  • Gli ostacoli statici che vengono deformati in un'altra posizione non possono essere previsti dagli agenti. Ciò crea il rischio che gli agenti rimangano bloccati qualora un ostacolo statico venga deformato sopra di loro.

Quando si utilizza l'evitamento 2D in 3D, l'asse y dei vertici del Vector3 è ignorato. Invece, la posizione globale dell'ostacolo sull'asse y è utilizzata come livello di elevazione. Gli agenti ignoreranno gli ostacoli statici in 3D che stanno sotto o sopra di loro. Questo viene determinato automaticamente dalla posizione globale dell'asse y sia dell'ostacolo sia dell'agente, utilizzata come livello di elevazione, nonché dalle rispettive proprietà di altezza.

Ostacoli di evitamento dinamici

Un ostacolo da evitare è considerato dinamico quando la sua proprietà radius è maggiore di zero.

  • Gli ostacoli dinamici si comportano da oggetti gentili del tipo "per favore allontanati da me" per gli agenti che usano l'evitamento, ad esempio similmente a come evitano altri agenti.

  • Gli ostacoli dinamici definiscono i propri confini con un singolo radius per un cerchio 2D, oppure, in caso di evitamento 3D, per una sfera.

  • Gli ostacoli dinamici possono cambiare posizione a ogni frame senza alcun impatto aggiuntivo sulle prestazioni.

  • Gli ostacoli dinamici con una velocità definita possono essere previsti nel loro movimento dagli agenti.

  • Gli ostacoli dinamici non sono un metodo affidabile per limitare i movimenti degli agenti in spazi ristretti o affollati.

Sebbene sia le proprietà statiche sia quelle dinamiche si possano attivare contemporaneamente sullo stesso ostacolo, ciò non è consigliato per motivi di prestazioni. Idealmente, quando un ostacolo si muove, i vertici statici sono rimossi e al loro posto è attivato il raggio. Quando l'ostacolo raggiunge la nuova posizione finale, dovrebbe gradualmente espandere il suo raggio per allontanare tutti gli altri agenti. Una volta creato abbastanza spazio sicuro intorno all'ostacolo, i vertici statici si dovrebbero ripristinare e il raggio rimosso. Questo aiuta a evitare che gli agenti rimangano bloccati nell'ostacolo statico che appare improvvisamente al termine della ricostruzione del confine statico.

Analogamente agli agenti, anche gli ostacoli possono utilizzare la maschera di bit avoidance_layers. Tutti gli agenti con un bit corrispondente sulla propria maschera di evitamento eviteranno l'ostacolo.

Ostacoli procedurali

È possibile creare nuovi ostacoli in uno script senza un nodo direttamente attraverso il NavigationServer.

Gli ostacoli creati tramite script richiedono almeno una mappa (map) e una posizione (position). Per un uso dinamico è necessario un raggio (radius). Per un uso statico è necessario un array di vertici (vertices).

# create a new "obstacle" and place it on the default navigation map.
var new_obstacle_rid: RID = NavigationServer2D.obstacle_create()
var default_map_rid: RID = get_world_2d().get_navigation_map()

NavigationServer2D.obstacle_set_map(new_obstacle_rid, default_map_rid)
NavigationServer2D.obstacle_set_position(new_obstacle_rid, global_position)

# Use obstacle dynamic by increasing radius above zero.
NavigationServer2D.obstacle_set_radius(new_obstacle_rid, 5.0)

# Use obstacle static by adding a square that pushes agents out.
var outline = PackedVector2Array([Vector2(-100, -100), Vector2(100, -100), Vector2(100, 100), Vector2(-100, 100)])
NavigationServer2D.obstacle_set_vertices(new_obstacle_rid, outline)

# Enable the obstacle.
NavigationServer2D.obstacle_set_avoidance_enabled(new_obstacle_rid, true)