Menu
CoddyTech

Corps cinématiques

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 6 sur 71.

Les plateformes mobiles, les ascenseurs et les portes doivent entrer en collision comme des objets solides, mais ils ne doivent ni tomber ni être poussés par ce qui atterrit dessus. C’est un corps cinématique : définissez rb.isKinematic = true, et la gravité, les forces et les impacts ne le déplacent plus. Son collider compte toujours : un corps dynamique (déplacé par la physique) le heurte comme un mur et se tient dessus comme sur le sol. Vous déplacez vous-même un corps cinématique avec rb.MovePosition.

Cet ascenseur monte à lift m/s jusqu’à atteindre top. MovePosition prend comme position celle à atteindre après cette étape ; le code ajoute donc le déplacement correspondant à une étape, en utilisant 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);
    }
}

Pourquoi ne pas définir transform.position ? Cela téléporte l’objet, et la physique ne sait jamais qu’il a bougé : une caisse posée sur une plateforme coulissante resterait sur place au lieu d’être entraînée. MovePosition indique à la physique que le corps s’est déplacé jusqu’au nouvel emplacement pendant l’étape ; ce qu’il touche est donc correctement transporté et poussé. AddForce n’a aucun effet sur un corps cinématique, et les corps cinématiques n’entrent jamais en collision avec des colliders statiques ni entre eux : seuls les corps dynamiques les heurtent.

challenge icon

Défi

Facile

Suspend la barge au-dessus de la lave et fais-la glisser avec les flèches.

  1. Dans Start(), définis rb.isKinematic = true;.
  2. Dans FixedUpdate(), lis float h = Input.GetAxisRaw("Horizontal"); et appelle rb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);.

Appuie sur « Jouer » et fais-la glisser : la barge reste suspendue dans les airs et le drone rebondit dessus. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class Barge : MonoBehaviour
{
    public float speed = 2f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        // Rends la barge cinématique
    }

    void FixedUpdate()
    {
        // Déplace-la le long de l’axe x avec les flèches
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity