unity3d Physics Rigidbodies


Example

Overview

The Rigidbody component gives a GameObject a physical presence in the scene in that it is able to respond to forces. You could apply forces directly to the GameObject or allow it to react to external forces such as gravity or another Rigidbody hitting it.


Adding a Rigidbody component

You can add a Rigidbody by clicking Component > Physics > Rigidbody


Moving a Rigidbody object

It is recommended that if you apply a Rigidbody to a GameObject that you use forces or torque to move it rather than manipulating it's Transform. Use AddForce() or AddTorque() methods for this:

// 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);

Mass

You can alter the mass of a Rigidbody GameObject to affect how it reacts with other Rigidbodies and forces. A higher mass means the GameObject will have more of an influence on other physics-based GameObjects, and will require a greater force to move itself. Objects of differing mass will fall at the same rate if they have the same drag values. To alter mass in code:

GetComponent<Rigidbody>().mass = 1000;

Drag

The higher the drag value, the more an object will slow down while moving. Think of it like an opposing force. To alter drag in code:

GetComponent<Rigidbody>().drag = 10;

isKinematic

If you mark a Rigidbody as Kinematic then it cannot be affected by other forces but can still affect other GameObjects. To alter in code:

GetComponent<Rigidbody>().isKinematic = true;

Constraints

It is also possible to add constraints to each axis to freeze the Rigidbody's position or rotation in local space. The default is RigidbodyConstraints.None as shown here:

enter image description here

An example of constraints in 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 

You can use the bitwise OR operator | to combine multiple constraints like so:

// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ | 
    RigidbodyConstraints.FreezeRotationX;

Collisions

If you want a GameObject with a Rigidbody on it to respond to collisions you will also need to add a collider to it. Types of collider are:

  • Box collider
  • Sphere collider
  • Capsule collider
  • Wheel collider
  • Mesh collider

If you apply more than one collider to a GameObject, we call it a Compound collider.

You can make a collider into a Trigger in order to use the OnTriggerEnter(), OnTriggerStay() and OnTriggerExit() methods. A trigger collider will not physically react to collisions, other GameObjects simply pass through it. They are useful for detecting when another GameObject is in a certain area or not, for example, when collecting an item, we may want to be able to just run through it but detect when this happens.