Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Sospendi la chiatta sopra la lava e falla scorrere con le frecce.

  1. In Start(), imposta rb.isKinematic = true;.
  2. In FixedUpdate(), leggi float h = Input.GetAxisRaw("Horizontal"); e chiama rb.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

Esercitati da solo: Playground Unity