Understanding the physics engine and all the options for controlling game objects can be quite daunting for a Unity newbie. How do I know when to use a rigidbody (kinematic or non-kinematic), a collider, the CharacterControllerScript, or something else?
What are the basic guidelines for what to use, and how/when to use them?
Here are some general rules-of-thumb.
When using CharacterController, movement is accomplished by calling the functions exposed by CharacterController. Interaction with other objects (platforms, crates, etc.) is accomplished by implementing the collision events exposed by CharacterController and applying forces to the objects the character collides with, or moving the character in response to the movement of the other objects.
When using a kinematic rigidbody, movement is accomplished by directly modifying your game object's Transform, or by calling rigidbody.MovePosition. (Note: the movement of kinematic rigidbodies should be done in FixedUpdate.)
When using a non-kinematic rigidbody, movement is typically accomplished by calling rigidbody.AddForce and rigidbody.AddTorque, or by setting the rigidbody.velocity and rigidbody.angularVelocity directly.
A good overview of the physics engine, rigidbodies, and colliders can be found in the Physics section of the Unity manual.
DiamondTearz has also compiled a good list of Unity physics tutorials/resources.
According to the docs, the CharacterController component "is mainly used for third-person or first-person player control that does not make use of Rigidbody physics." In other words, the CharacterController is a handy component you can apply to a game object if you don't want it to be controlled by the physics engine, but you don't want to have to write your own custom controller code from scratch.
Why wouldn't you want your character controlled by the physics engine? Well, oftentimes a character's movement is not physically realistic. A character might run like a rocket-powered cheetah, change directions mid-air, etc.
CharacterController allows you to create this kind of unrealistic movement, but handles many of the basics for you -- things like walking up steps and keeping your character from walking through walls.
Why wouldn't you want to use CharacterController? If your character isn't a human-like entity walking on the ground, it may not be a good fit.
More info on CharacterController can be found here.
Protip: A lot of the default scripts are wrong, for example the old Lerpz tutorial, the FPS tutorial, and the tropical island demo. If you use these scripts as-is and you have a good framerate, you'll notice heavy jittering.
The cause is almost always that the camera updates its position using Update(), but the physics simulation only updates on FixedUpdate(). To avoid jittering, ALL objects which use physics movement, plus the camera, should ONLY change their position in FixedUpdate(), never Update(). Non-physical movements and animations can feel free to update in Update(). The camera is especially sensitive to this, since even slight jittering will affect the whole screen.
answered Jun 18, 2010 at 08:57 AM