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.

Forme di collisione (2D)

Questa guida spiega:

  • I tipi di forme di collisione disponibili in 2D in Godot.

  • Utilizzare un'immagine convertita in poligono come forma di collisione.

  • Considerazioni sulle prestazioni riguardo le collisioni 2D.

Godot offre diversi tipi di forme di collisione, con differenti compromessi di prestazioni e di precisione.

È possibile definire la forma di un PhysicsBody2D aggiungendo uno o più CollisionShape2D o CollisionPolygon2D come nodi figli diretti. I nodi figli indiretti (ovvero i figli dei nodi figli) saranno ignorati e non saranno utilizzati come forme di collisione. Inoltre, si noti che è necessario aggiungere una risorsa Shape2D ai nodi della forma di collisione nel pannello Ispettore.

Nota

Quando si aggiungono più forme di collisione a un singolo PhysicsBody2D, non c'è da preoccuparsi quando si sovrappongono. Non si "scontreranno" tra loro.

Forme primitive di collisione

Godot fornisce i seguenti tipi di forme primitive di collisione:

È possibile rappresentare la collisione della maggior parte degli oggetti più piccoli utilizzando una o più forme primitive. Tuttavia, per oggetti più complessi, come una grande nave o un intero livello, potrebbero essere necessarie forme convesse o concave. Maggiori dettagli in seguito.

Per gli oggetti dinamici, consigliamo di preferire le forme primitive come RigidBody e CharacterBody, in quanto il loro comportamento è il più affidabile. Spesso offrono anche prestazioni migliori.

Forme convesse di collisione

Avvertimento

Attualmente Godot non offre un modo integrata per creare forme di collisione convesse in 2D. Questa sezione è qui principalmente a scopo di riferimento.

Le forme convesse di collisione sono un compromesso tra le forme primitive di collisione e quelle concave. Possono rappresentare forme di qualsiasi complessità, ma con un'importante condizione. Come suggerisce il nome, una singola forma può rappresentare solo una forma convessa. Ad esempio, una piramide è convessa, ma una scatola cava è concava. Per definire un oggetto concavo con una singola forma di collisione, è necessario utilizzare una forma concava di collisione.

A seconda della complessità dell'oggetto, è possibile ottenere prestazioni migliori utilizzando più forme convesse anziché una forma concava di collisione. Godot consente di usare la decomposizione convessa per generare forme convesse che corrispondono più o meno a un oggetto cavo. Si noti che questo vantaggio sulle prestazioni non si applica più dopo un certo numero di forme convesse. Per oggetti grandi e complessi, come un intero livello, si consiglia di utilizzare forme concave.

Forme concave (o trimesh) di collisione

Le forme concave di collisione, dette anche forme trimesh di collisione, possono assumere qualsiasi forma, da pochi triangoli a migliaia di triangoli. Le forme concave sono l'opzione più lenta ma anche la più precisa in Godot. È possibile utilizzare le forme concave solo all'interno dei StaticBody. Non funzioneranno con CharacterBody o RigidBody a meno che la modalità del RigidBody non sia Static.

Nota

Sebbene le forme concave offrano la collisione più accurata, la segnalazione dei contatti può essere meno precisa rispetto alle forme primitive.

Quando non si utilizzano le TileMap per progettare livelli, le forme concave rappresentano l'approccio migliore per le collisioni di un livello.

È possibile configurare la modalità di costruzione del nodo CollisionPolygon2D nell'ispettore. Se è impostata su Solidi (predefinito), le collisioni includeranno il poligono e l'area in esso contenuta. Se è impostata su Segmenti, le collisioni includeranno solo i bordi del poligono.

È possibile generare una forma concava di collisione dall'editor selezionando uno Sprite2D e utilizzando il menu Sprite2D in alto la viewport 2D. Il menu a tendina dello Sprite2D mostra un'opzione chiamata Crea CollisionPolygon2D fratello. Una volta cliccata, apparirà un menu con 3 impostazioni:

  • Semplificazione: valori più elevati produrranno una forma meno dettagliata, il che migliora le prestazioni a scapito della precisione.

  • Rimpicciolisci (Pixel): valori più alti rimpiccioliranno il poligono di collisione generato rispetto ai bordi dello sprite.

  • Ingrandisci (Pixel): valori più alti ingrandiranno il poligono di collisione generato rispetto ai bordi dello sprite. Si noti che impostare Ingrandisci e Rimpicciolisci su valori uguali può produrre risultati diversi rispetto a lasciarli entrambi su 0.

Nota

Se si dispone di un'immagine con molti piccoli dettagli, consigliamo di crearne una versione semplificata e usarla per generare il poligono di collisione. Ciò può migliorare le prestazioni e l'esperienza di gioco, poiché il giocatore non sarà bloccato da piccoli dettagli decorativi.

Per utilizzare un'immagine separata per la generazione del poligono di collisione, crea un altro Sprite2D, genera un poligono di collisione fratello da esso, infine rimuovi il nodo Sprite2D. Così si possono escludere i piccoli dettagli dalla collisione generata.

Avvertimenti sulle prestazioni

Non si è limitati a una singola forma di collisione per PhysicsBody. Tuttavia, consigliamo di mantenere il numero di forme il più basso possibile per migliorare le prestazioni, soprattutto per oggetti dinamici come RigidBody e CharacterBody. Oltretutto, evitare di traslare, ruotare o ridimensionare le CollisionShape per beneficiare delle ottimizzazioni interne del motore di fisica.

Quando si utilizza una singola forma di collisione non trasformata in uno StaticBody, l'algoritmo broad phase ("fase ampia") del motore può scartare i PhysicsBody inattivi. La narrow phase ("fase ristretta") dovrà quindi tenere conto solo delle forme dei corpi attivi. Se uno StaticBody ha molte forme di collisione, la broad phase fallirà. La narrow phase, che è più lenta, dovrà quindi effettuare una verifica di collisione su ciascuna forma.

Se si riscontrano problemi di prestazioni, potrebbe essere necessario fare compromessi in termini di precisione. La maggioranza dei giochi non garantisce una collisione precisa al 100%. Trovano modi creativi per nasconderla o renderla impercettibile durante il normale gameplay.