According to the Ray Wenderlich Unity 2D tutorial by Christopher LaPollo, Unity’s physics engine builds a simulation based on the Colliders present in a scene. If some those Colliders
are declared to be static
, then the entire simulation is rebuilt when those colliders move. Of course, rebuilding a physics simulation when it’s unnecessary is inefficient. By declaring objects to have dynamic
Colliders
, the physics engine does not have to rebuild the simulation at runtime, that is to say when the game is running.
As with a lot of things in Unity, it is not immediately apparent how you should go about declaring a collider to be static
or dynamic
. It would be great if there were just a checkbox in the Collider
component. But there isn’t. It appears that there are some complex things going on under the hood that preclude a simple declaration.
By default a GameObject
with a Collider
component attached is treated as static
by Unity’s physics engine. This would work for a non-moving wall or impassable bit of scenery, but for moving objects like enemies we need to mark them as dynamic
. In order for a GameObject
’s Collider
to qualify as dynamic
it requires a Rigidbody
component. If you don’t want the normal features of the Rigidbody
, i.e. conferring control of the GameObject
’s position to the physics system, then you can check the Is Kinematic
checkbox. A kinematic object’s position is under the control of the attached scripts, rather than the physics system.
One other trick from the tutorial is to set the Collider
component’s isTrigger
property to true
. This prevents the Collider
from being treated as a solid object in the physics simulation, which could lead to unintended bumping and pushing among various Colliders
in a scene.
Update: @InvolvingSalmon points out that the instructions here depend on the version of Unity that you are using. This article was written for Unity version 4.5.2f1
.