unity3d
La physique
Recherche…
Corps rigides
Vue d'ensemble
Le composant Rigidbody donne à un GameObject une présence physique dans la scène en ce qu’il est capable de répondre aux forces. Vous pouvez appliquer des forces directement sur le GameObject ou lui permettre de réagir à des forces externes telles que la gravité ou un autre corps rigide qui le frappe.
Ajouter un composant Rigidbody
Vous pouvez ajouter un Rigidbody en cliquant sur Composant> Physique> Rigidbody
Déplacement d'un objet Rigidbody
Si vous utilisez un Rigidbody sur un GameObject, il est recommandé d’utiliser des forces ou un couple pour le déplacer plutôt que de le transformer. Utilisez les AddForce()
ou AddTorque()
pour cela:
// Add a force to the order of myForce in the forward direction of the Transform.
GetComponent<Rigidbody>().AddForce(transform.forward * myForce);
// Add torque about the Y axis to the order of myTurn.
GetComponent<Rigidbody>().AddTorque(transform.up * torque * myTurn);
Masse
Vous pouvez modifier la masse d'un objet Rigidbody GameObject pour influer sur la façon dont il réagit avec les autres corps rigides et les autres forces. Une masse plus élevée signifie que le GameObject aura plus d'influence sur d'autres GameObjects basés sur la physique et nécessitera une plus grande force pour se déplacer. Les objets de masse différente tomberont au même rythme s'ils ont les mêmes valeurs de glissement. Modifier la masse en code:
GetComponent<Rigidbody>().mass = 1000;
Traîne
Plus la valeur de glissement est élevée, plus un objet ralentira en se déplaçant. Pensez-y comme une force adverse. Pour modifier le glisser dans le code:
GetComponent<Rigidbody>().drag = 10;
isKinematic
Si vous marquez un Rigidbody comme Kinematic, il ne peut pas être affecté par d'autres forces, mais il peut toujours affecter d'autres GameObjects. Pour modifier dans le code:
GetComponent<Rigidbody>().isKinematic = true;
Contraintes
Il est également possible d'ajouter des contraintes à chaque axe pour geler la position ou la rotation du corps rigide dans l'espace local. La valeur par défaut est RigidbodyConstraints.None
comme indiqué ici:
Un exemple de contraintes dans le code:
// Freeze rotation on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation
// Freeze position on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePosition
// Freeze rotation and motion an all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll
Vous pouvez utiliser l'opérateur OR au niveau du bit |
pour combiner plusieurs contraintes comme ceci:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
Les collisions
Si vous souhaitez qu'un GameObject avec un Rigidbody y réponde, vous devrez également ajouter un collisionneur. Les types de collisionneur sont:
- Boîte collisionneur
- Sphère collisionneur
- Collisionneur de capsules
- Roue collisionneur
- Collisionneur de maille
Si vous appliquez plusieurs collisionneurs à un objet GameObject, nous l'appelons un collisionneur composé.
Vous pouvez créer un collider dans un déclencheur afin d'utiliser les OnTriggerEnter()
, OnTriggerStay()
et OnTriggerExit()
. Un collisionneur de déclenchement ne réagira pas physiquement aux collisions, les autres GameObjects le traversent simplement. Ils sont utiles pour détecter lorsqu'un autre objet GameObject se trouve dans une zone donnée ou non, par exemple, lors de la collecte d'un élément, nous pouvons être en mesure de le parcourir, mais détecter quand cela se produit.
Gravité dans un corps rigide
La propriété useGravity
d'un RigidBody
contrôle si la gravité l'affecte ou non. Si défini sur false
le RigidBody
se comportera comme si dans l'espace (sans qu'une force constante lui soit appliquée dans une certaine direction).
GetComponent<RigidBody>().useGravity = false;
C'est très utile dans les situations où vous avez besoin de toutes les autres propriétés de RigidBody
à l'exception du mouvement contrôlé par gravité.
Lorsque cette RigidBody
est activée, le RigidBody
sera affecté par une force gravitationnelle définie sous Physics Settings
:
La gravité est définie en unités mondiales par seconde au carré et est entrée ici en tant que vecteur tridimensionnel: avec les paramètres de l'image d'exemple, tous les RigidBodies
avec la propriété useGravity
définie sur True
auront une force de 9,81 unités mondiales par seconde. par seconde dans la direction vers le bas (lorsque les valeurs Y négatives dans le système de coordonnées d'Unity sont orientées vers le bas).