Corpi cinematici
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 6 di 63.
Le piattaforme mobili, gli ascensori e le porte devono scontrarsi come oggetti solidi, ma non devono cadere né essere spinti da ciò che vi si posa sopra. Questo è un corpo cinematico: imposta rb.isKinematic = true e la gravità, le forze e gli urti non lo sposteranno più. Il suo collider continua a essere rilevato, quindi un corpo dinamico (che viene spostato dalla fisica) lo urta come farebbe con un muro e ci sta sopra come su un pavimento. Sei tu a spostare un corpo cinematico, usando rb.MovePosition.
Questo ascensore sale a lift m/s finché non raggiunge top. MovePosition riceve la posizione che il corpo deve raggiungere al termine di questo passo, quindi il codice aggiunge lo spostamento di un passo, 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 si accorge mai che si è spostato: una cassa su una piattaforma scorrevole resterebbe indietro invece di seguirla. MovePosition comunica alla fisica che il corpo si è spostato fino alla nuova posizione durante il passo, 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
FacileLa chiatta è sospesa sopra la lava e le frecce dovrebbero farla scorrere a sinistra e a destra lungo l’asse x a speed m/s (2 nell’Inspector). Al momento il suo Rigidbody è normale, quindi cade nella lava.
- Quando inizia il gioco, rendi la chiatta cinematica, così rimane sospesa in aria e niente di ciò che la colpisce può spingerla via.
- Spostala con
MovePositioninFixedUpdate(), usando l’asse Horizontal grezzo.
Premi Play e fai scorrere la chiatta, poi premi Check.
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
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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 rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere