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?
Answer by Ehren
Nov 03, 2009 at 11:22 PM
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.
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.
Very nice post. Excellent overview and summation. Is it in the wiki yet?
DiamondTearz now only has some scented candles in the link you provided...
Thank you for the thorough answer. This helped me get a much better understanding of when to use each component.
Answer by WarpZone
Jun 18, 2010 at 08:57 AM
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.
Shouldn't cameras that follow other objects use LateUpdate?
This really is a protip, kudos to WarpZone for mentioning this. Warp, I'm sure you agree that the situation is made even more touchy when you are using networking to move objects. You have to be particularly careful in your thinking about what is really done when. The issue came up in this question http://answers.unity3d.com/questions/190028/multiplayer-jitter-caused-by-camera.html which may help others passing here
Answer by Phoera
Aug 18, 2015 at 09:13 PM
Though Warp's advice is commonly true, in my concrete situation i got rid of jittering by using FixedUpdate for character moving and Update for all the camera issues, so you should play with it to see if it fits your situation
Answer by mar10
Apr 09, 2015 at 04:36 AM
WarpZone is right, the camera frame rate needs to match the frame rate at which the rigidbodies update in position/rotation. i applied his advice & manage to get smooth behavior form the rigidbodies.
Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.
The best place to ask and answer questions about development with Unity.
To help users navigate the site we have posted a site navigation guide.
If you are a new user, check out our FAQ for more information.
If you are a moderator, see our Moderator Guidelines page.
We are making improvements to UA, see the list of changes.
Answers and Comments
3 People are following this question.
Preventing objects from intersecting with minimal physics
Character Controller - Got Hit and Flying Physic
Is it possible to tell Unity physics to ignore a collision at collision time?
Objects rotating after falling on another object with Physics & Gravity?
Make a collider NOT collide with CharacterController