FixedUpdate per la fisica
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 4 di 71.
Unity muove i corpi in intervalli di fisica fissi di 0.02 secondi (Time.fixedDeltaTime), 50 al secondo, indipendentemente dalla frequenza dei fotogrammi. FixedUpdate() viene eseguito subito prima di ogni intervallo. Update() viene eseguito una volta per ogni fotogramma disegnato, e può accadere 30, 60 o 144 volte al secondo: a 144, la maggior parte dei fotogrammi non ha alcun intervallo di fisica, mentre su un computer lento un fotogramma può contenerne due.
Ne conseguono due regole. Una forza aggiunta in Update() viene aggiunta una volta per fotogramma, quindi un computer più veloce spinge con più forza: le forze che agiscono nel tempo vanno in FixedUpdate(). Inoltre, GetKeyDown è vero per un solo fotogramma; se quel fotogramma non ha un intervallo di fisica, FixedUpdate() non lo rileva e la pressione viene persa. Quindi leggi le pressioni in Update(), memorizzale in un bool e agisci su di esse in FixedUpdate(). Questa barca viene spinta da un vento costante e scatta lateralmente al clic:
private bool dashQueued;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
dashQueued = true; // ricorda il clic
}
}
void FixedUpdate()
{
rb.AddForce(Vector3.forward * wind); // una spinta costante, a ogni passo
if (dashQueued)
{
rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
dashQueued = false; // un clic, uno scatto
}
}È importante azzerare il bool dopo averlo usato: se lasciato true, farebbe scattare la barca a ogni intervallo. Si potrebbe anche aggiungere un singolo impulso direttamente da Update(), come per il salto della rana; il bool tiene tutte le spinte in un unico posto, insieme alle forze con cui interagisce. I tasti tenuti premuti (GetKey, GetAxis) descrivono uno stato anziché un momento, quindi FixedUpdate() può leggerli direttamente. All'interno di FixedUpdate(), Time.deltaTime restituisce il valore 0.02 dell'intervallo.
Sfida
FacileInserisci le due operazioni della slitta nei metodi corretti.
- Sposta i due blocchi
ifdelle frecce daUpdate()aFixedUpdate(). - Aggiungi
private bool hopPressed;. InUpdate(), impostalo sutruequando viene premutoInput.GetKeyDown(KeyCode.Space). - In
FixedUpdate(), quandohopPressedè impostato, aggiungi l'impulso, poi impostalo sufalse.
Premi «Gioca»: le frecce spingono in modo uniforme e ogni pressione della barra spaziatrice fa saltare la slitta. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public class Sled : MonoBehaviour
{
public float push = 6f;
public float hop = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
rb.AddForce(Vector3.right * push);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rb.AddForce(Vector3.left * push);
}
}
void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * hop, ForceMode.Impulse);
}
}
}
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliereEsercitati da solo: Playground Unity