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 dell'interpolazione della fisica

Come integriamo l'interpolazione fisica in un gioco di Godot? C'è qualche avvertenza?

Abbiamo cercato di rendere il sistema il più semplice possibile da usare, e molti giochi esistenti funzioneranno con poche modifiche. Detto questo, ci sono alcune situazioni che richiedono un trattamento speciale, e queste saranno descritte di seguito.

Attivare l'impostazione dell'interpolazione della fisica

Il primo passo è attivare l'interpolazione della fisica in Impostazioni del progetto > Fisica > Comune > Interpolazione della fisica. Ora si può eseguire il gioco.

È probabile che nulla sembri molto diverso, soprattutto se si esegue la fisica a 60 TPS o a un multiplo di essa. Tuttavia, dietro le quinte sta succedendo molto di più.

Suggerimento

Per convertire un gioco esistente in modo che utilizzi l'interpolazione, è altamente consigliato impostare temporaneamente Impostazioni del progetto > Fisica > Comune > Tick di fisica al secondo su un valore basso, ad esempio 10, che renderà più evidenti i problemi di interpolazione.

Spostare (quasi) tutta la logica di gioco da _process a _physics_process

Il requisito fondamentale per l'interpolazione della fisica (che si potrebbe già aver già implementato) è che si dovrebbe spostare ed eseguire la logica di gioco sugli oggetti all'interno di _physics_process (che è eseguito a ogni tick di fisica) anziché di _process (che è eseguito su un frame renderizzato). Ciò significa che gli script dovrebbero in genere svolgere la maggior parte della loro elaborazione all'interno di _physics_process, inclusa la risposta agli input e all'IA.

Impostando la trasformazione degli oggetti solo all'interno dei tick di fisica, l'interpolazione automatica gestisce le trasformazioni tra i tick di fisica e garantisce che il gioco funzioni allo stesso modo su qualsiasi computer. In più, ciò riduce anche l'utilizzo della CPU se il gioco renderizza ad alti FPS, poiché la logica dell'IA (ad esempio) non sarà più eseguita su ogni frame renderizzato.

Nota

Se si tenta di impostare la trasformazione degli oggetti interpolati fuori dal tick di fisica, i calcoli per la posizione interpolata saranno errati, e pertanto avverrà un tremolio. Questo tremolio potrebbe non essere evidente sul computer in uso, ma avverrà per alcuni giocatori. Per questo motivo, si dovrebbe evitare di impostare la trasformazione degli oggetti interpolati fuori dal tick di fisica. Godot tenterà di generare avvisi nell'editor se questo caso viene rilevato.

Suggerimento

Questa è solo una regola flessibile. Ci sono alcune occasioni in cui potrebbe essere desiderato teletrasportare oggetti fuori dal tick di fisica (ad esempio all'inizio di un livello o quando si rigenerano oggetti). Però, in generale, si dovrebbero applicare le trasformazioni dal tick di fisica.

Assicurarsi che tutti i movimenti indiretti avvengano durante i tick di fisica

Considera che in Godot, i nodi si possono muovere non solo direttamente nei propri script, ma anche tramite metodi automatici come tweening, animazione e navigazione. Tutti questi metodi dovrebbero inoltre avere la loro temporizzazione impostata per operare nel tick di fisica piuttosto che in ogni frame ("idle"), se si usano per spostare oggetti (è possibile usare questi metodi anche per controllare proprietà non interpolate).

Nota

Considera inoltre che è possibile muovere i nodi non solo da soli, ma anche muovendo i nodi padre in SceneTree. Quindi, anche il movimento dei nodi padre dovrebbe avvenire solo durante i tick di fisica.

Scegliere una frequenza di tick di fisica

Utilizzando l'interpolazione della fisica, il rendering è disaccoppiato dalla fisica e si può scegliere qualsiasi valore ha senso per il proprio gioco. Non si è più limitati a valori multipli della frequenza di aggiornamento di un monitor (per giocare senza scatti se si raggiungono gli FPS previsti).

Come regola generale:

Frequenze di tick basse (10-30)

Frequenze di tick medie (30-60)

Frequenze di tick alte (60+)

Migliori prestazioni sulla CPU

Buon comportamento fisico in scene complesse

Buono con fisica rapida

Aggiunge un po' di ritardo all'input

Ideale per giochi in prima persona

Ideale per giochi da corsa

Comportamento fisico semplice

Nota

È sempre possibile cambiare la frequenza di aggiornamento (tick rate) durante lo sviluppo, basta modificare l'impostazione del progetto.

Chiamare reset_physics_interpolation() quando si teletrasportano oggetti

La maggior parte delle volte, l'interpolazione tra due tick di fisica è gradevole. Tuttavia, esiste una situazione in cui potrebbe non esserlo. È quando gli oggetti vengono posizionati inizialmente, o totalmente in un altro posto. In questo caso, non è ideale avere un movimento fluido tra dove stava l'oggetto (ad esempio, l'origine) e la posizione iniziale; sarebbe meglio una mossa istantanea.

La soluzione consiste nel chiamare la funzione Node.reset_physics_interpolation. Quello che fa dietro le quinte è impostare la trasformazione precedente (memorizzata internamente) dell'oggetto in modo che sia uguale alla trasformazione attuale. Ciò garantisce che, durante l'interpolazione tra queste due trasformazioni uguali, non ci sarà alcun movimento.

Anche se dimentichi di chiamare questa funzione, di solito non è un problema nella maggior parte delle situazioni (soprattutto con frequenze di tick elevate). È qualcosa che si può facilmente rimandare alla fase di rifinitura del gioco. Nel peggiore dei casi, vedrai un movimento rapido per un frame circa quando li sposti: saprai quando ne avrai bisogno!

In realtà ci sono due modi per usare reset_physics_interpolation():

Partenza da fermo (ad esempio, il giocatore)

  1. Imposta la trasformazione iniziale

  2. Chiama reset_physics_interpolation()

La trasformazione precedente e attuale saranno identiche, risultando in nessun movimento iniziale.

Partenza in movimento (ad esempio, un proiettile)

  1. Imposta la trasformazione iniziale

  2. Chiama reset_physics_interpolation()

  3. Imposta immediatamente la trasformazione prevista dopo il primo tick di movimento

La trasformazione precedente sarà la posizione iniziale e la trasformazione attuale agirà come se un tick di simulazione fosse già avvenuto. Questo farà immediatamente partire il movimento dell'oggetto, anziché avere un ritardo di tick rimanendo fermo.

Importante

Assicurati di impostare la trasformazione e di chiamare reset_physics_interpolation() nell'ordine corretto, come mostrato sopra, altrimenti vedrai "rapidi movimenti" indesiderati.

Test e consigli per il debug

Anche se intendi eseguire la fisica a 60 TPS, per testare a fondo l'interpolazione e ottenere un'esperienza di gioco più fluida, è altamente consigliato impostare temporaneamente la frequenza dei tick di fisica su un valore basso, come ad esempio 10 TPS.

Il gioco potrebbe non funzionare alla perfezione, ma dovrebbe aiutare a individuare i casi in cui dovresti chiamare Node.reset_physical_interpolation o dove dovresti utilizzare la tua interpolazione personalizzata, ad esempio su un Camera3D. Una volta risolti questi casi, puoi reimpostare la frequenza dei tick di fisica al valore desiderato.

L'altro grande vantaggio di testare con una frequenza bassa è che spesso puoi notare altri sistemi di gioco che sono sincronizzati con il tick di fisica e creano problemi che potresti voler aggirare. Esempi tipici includono l'impostazione dei valori di fusione di un'animazione, che potresti decidere di impostare in _process() e interpolare manualmente.

Nota

In 2D, la posizione delle forme di collisione visibili mostrata dall'opzione Debug > Visible Collision Shapes terrà conto dell'interpolazione della fisica.

Al contrario, in 3D, la posizione delle forme di collisione visibili non terrà conto dell'interpolazione della fisica. Ciò significa che le forme di collisione visibili potrebbero apparire meno fluide e leggermente davanti alla rappresentazione visiva dell'oggetto quando l'oggetto è in movimento. Questo non è un bug, ma una conseguenza di come l'interpolazione della fisica è implementata in 3D.