← Cheatsheets
Tags: unity, rigidbody, collision, trigger, physics, layer-matrix, impulses, game-dev
Last updated: 2026-06-27
Rigidbody & Collision Cheatsheet
Quick Reference
| Concept | Key Point |
| Collider | Defines shape for collision detection |
| Rigidbody | Makes object respond to physics forces |
| Trigger | Collider with Is Trigger = true — detects overlap, no physical response |
| Kinematic | Rigidbody with Is Kinematic = true — script-driven, ignores forces |
| Continuous Detection | Prevents tunnelling for fast-moving objects |
Rigidbody Component
Key Properties
| Property | Description |
| Mass | Affects collision response (heavier = harder to push) |
| Drag | Air resistance (0 = none, higher = decelerates faster) |
| Angular Drag | Rotational resistance |
| Use Gravity | Enable/disable gravity on this object |
| Is Kinematic | Script controls transform; ignores forces and collisions with static colliders |
| Interpolate | Smooths transform between physics steps (None / Interpolate / Extrapolate) |
| Collision Detection | Discrete / Continuous / Continuous Dynamic / Continuous Speculative |
| Constraints | Freeze position/rotation on X, Y, Z axes |
Force Application Modes
| Mode | Use Case |
Force | Continuous force (mass-dependent, applied over time) |
Acceleration | Continuous acceleration (ignores mass) |
Impulse | Instant force (mass-dependent, e.g. jump, explosion) |
VelocityChange | Instant velocity change (ignores mass) |
# Apply force examples
rb.AddForce(Vector3.forward * 10f, ForceMode.Force);
rb.AddForce(Vector3.up * 500f, ForceMode.Impulse); # Jump
rb.AddForce(explosionDir * 1000f, ForceMode.Impulse); # Explosion
Collider Types
| Type | Shape | Best For | Performance |
| BoxCollider | Rectangular | Walls, floors, crates | Fast |
| SphereCollider | Sphere | Rolling objects, triggers | Fast |
| CapsuleCollider | Capsule | Character bodies | Medium |
| MeshCollider | Arbitrary mesh | Complex static geometry | Slow (Convex = faster) |
| WheelCollider | Specialised | Vehicle wheels | Medium |
| TerrainCollider | Heightmap | Terrain surfaces | Medium |
Collider Tips
- Primitive colliders (box, sphere, capsule) are always faster than mesh colliders.
- MeshCollider.Convex = true enables collision with other convex mesh colliders (max 255 triangles).
- Compound colliders — use multiple primitive colliders on one GameObject for complex shapes (cheaper than MeshCollider).
- Collider size — avoid micro-colliders (<0.01 units); PhysX has a minimum contact offset.
Triggers vs Colliders
| Aspect | Collider | Trigger |
| Physical response | Yes (bounce, push, stop) | No (overlap only) |
| Callback | OnCollisionEnter/Stay/Exit | OnTriggerEnter/Stay/Exit |
| Use case | Walls, floors, physics objects | Pickup zones, damage areas, checkpoints |
| Setting | Is Trigger = false | Is Trigger = true |
Trigger Callbacks
void OnTriggerEnter(Collider other) { } # First frame of overlap
void OnTriggerStay(Collider other) { } # Every frame during overlap
void OnTriggerExit(Collider other) { } # First frame after separation
Collision Callbacks
void OnCollisionEnter(Collision collision) { }
# collision.contacts[] — array of contact points
# collision.relativeVelocity — impact speed
# collision.impulse — total impulse applied
void OnCollisionStay(Collision collision) { }
void OnCollisionExit(Collision collision) { }
Collision Detection Modes
| Mode | Description | When to Use |
| Discrete | Checks at fixed intervals | Slow-moving objects |
| Continuous | Sweeps collider against static geometry | Fast-moving player vs static world |
| Continuous Dynamic | Sweeps against all colliders | Fast-moving dynamic objects (bullets) |
| Continuous Speculative | Broad-phase sweep, then speculative contacts | Kinematic bodies, many fast objects |
Tunnelling Prevention
- Tunnelling — object moves so fast it passes through a collider between physics steps.
- Fix: use Continuous / Continuous Dynamic detection.
- Alt fix: increase physics timestep (Edit → Project Settings → Time → Fixed Timestep, default 0.02s).
- Alt fix: raycast ahead of movement (manual sweep test).
Layer-Based Collision Matrix
Configure in Edit → Project Settings → Physics → Layer Collision Matrix.
| Pattern | Setup |
| Player ignores other players | Untick Player/Player cell |
| Bullets only hit enemies + walls | Tick Bullet/Enemy + Bullet/Environment |
| Triggers ignore visuals | Tick Trigger/Player only |
# Check layer at runtime
if (other.gameObject.layer == LayerMask.NameToLayer("Enemy")) { }
# Raycast with layer mask
int mask = LayerMask.GetMask("Ground", "Wall");
Physics.Raycast(origin, direction, out hit, 100f, mask);
Physics Materials
| Property | Description |
| Dynamic Friction | Friction while moving (0–1) |
| Static Friction | Friction to start moving (0–1) |
| Bounciness | Restitution (0 = no bounce, 1 = perfect bounce) |
| Friction Combine | Average / Minimum / Maximum / Multiply |
| Bounce Combine | Average / Minimum / Maximum / Multiply |
# Create via code
PhysicMaterial mat = new PhysicMaterial();
mat.dynamicFriction = 0.3f;
mat.staticFriction = 0.5f;
mat.bounciness = 0.8f;
GetComponent<Collider>().material = mat;
Common Patterns
Explosion Force
Vector3 origin = transform.position;
float radius = 5f;
float power = 1000f;
Collider[] hits = Physics.OverlapSphere(origin, radius);
foreach (Collider hit in hits) {
Rigidbody rb = hit.GetComponent<Rigidbody>();
if (rb) rb.AddExplosionForce(power, origin, radius, 3f);
}
Raycast for Ground Check
bool isGrounded = Physics.Raycast(
transform.position, Vector3.down, 0.1f, groundMask);
MovePosition (Kinematic)
Rigidbody rb = GetComponent<Rigidbody>();
rb.MovePosition(rb.position + velocity * Time.fixedDeltaTime);
rb.MoveRotation(Quaternion.Euler(0, rotation, 0));
# Always use MovePosition/MoveRotation in FixedUpdate
Performance Tips
- Use primitive colliders over MeshCollider where possible.
- Disable Rigidbody when not needed (e.g.
Sleep()).
- Reduce
solverIterations on low-priority Rigidbodies.
- Use layers to minimise unnecessary collision pairs.
- Batch static colliders with
Static flag (static batching).