Menu
CoddyTech

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.

challenge icon

Sfida

Facile

La 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 MovePosition in FixedUpdate(), 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
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay