Corpi cinematici
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 6 di 71.
Piattaforme mobili, ascensori e porte devono collidere come oggetti solidi, ma non devono cadere né essere spinti qua e là da ciò che ci atterra sopra. Questo è un corpo cinematico: imposta rb.isKinematic = true, e gravità, forze e urti non lo muoveranno più. Il suo collider continua a contare, quindi un corpo dinamico (che viene mosso dalla fisica) gli urta contro come contro un muro e ci sta sopra come sul pavimento. Sei tu a muovere un corpo cinematico, con rb.MovePosition.
Questo ascensore sale a lift m/s fino a raggiungere top. MovePosition accetta la posizione da raggiungere dopo questo passaggio, quindi il codice aggiunge lo spostamento di un passaggio, usando Time.fixedDeltaTime:
void Start()
{
rb = GetComponent<Rigidbody>();
rb.isKinematic = true;
}
void FixedUpdate()
{
if (rb.position.y < top)
{
rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
}
}Perché non impostare transform.position? In questo modo l'oggetto viene teletrasportato e la fisica non viene mai informata del suo movimento: una cassa su una piattaforma scorrevole resterebbe indietro invece di essere trasportata. MovePosition comunica alla fisica che il corpo si è spostato nella nuova posizione durante il passaggio, così ciò che tocca viene trasportato e spinto correttamente. AddForce non ha alcun effetto su un corpo cinematico, e i corpi cinematici non collidono mai con i collider statici né tra loro: solo i corpi dinamici li urtano.
Sfida
FacileSospendi la chiatta sopra la lava e falla scorrere con le frecce.
- In
Start(), impostarb.isKinematic = true;. - In
FixedUpdate(), leggifloat h = Input.GetAxisRaw("Horizontal");e chiamarb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);.
Premi «Gioca» e falla scorrere: la chiatta resta sospesa in aria e il drone rimbalza. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// Rendi la chiatta cinematica
}
void FixedUpdate()
{
// Falla scorrere lungo x con le frecce
}
}
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