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.
Défi
FacileSuspend la barge au-dessus de la lave et fais-la glisser avec les flèches.
- Dans
Start(), définisrb.isKinematic = true;. - Dans
FixedUpdate(), lisfloat h = Input.GetAxisRaw("Horizontal");et appellerb.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
1Corps rigide
Gravité et massePousser avec AddForceSauter avec une impulsionFixedUpdate pour la physiqueVitesseCorps cinématiquesRécapitulatif : plateforme de lancement4Coroutines
InvoquerInvokeRepeating, CancelInvokeVotre première coroutineBoucles dans les coroutinesArrêter les coroutinesRécapitulatif : compte à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
OnCollisionEnterQu’est-ce que j’ai touché ?Se briser à l’impactRester au solRebond et frictionFormes des collidersRécapitulatif : mur destructible5Projet : Course aux pièces
La balle roulanteDes pièces à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porteEntraînez-vous par vous-même : Playground Unity