Tags: unity, rigidbody, collision, trigger, physics, layer-matrix, impulses, game-dev Last updated: 2026-06-27

Rigidbody & Collision Cheatsheet

Quick Reference

ConceptKey Point
ColliderDefines shape for collision detection
RigidbodyMakes object respond to physics forces
TriggerCollider with Is Trigger = true — detects overlap, no physical response
KinematicRigidbody with Is Kinematic = true — script-driven, ignores forces
Continuous DetectionPrevents tunnelling for fast-moving objects

Rigidbody Component

Key Properties

PropertyDescription
MassAffects collision response (heavier = harder to push)
DragAir resistance (0 = none, higher = decelerates faster)
Angular DragRotational resistance
Use GravityEnable/disable gravity on this object
Is KinematicScript controls transform; ignores forces and collisions with static colliders
InterpolateSmooths transform between physics steps (None / Interpolate / Extrapolate)
Collision DetectionDiscrete / Continuous / Continuous Dynamic / Continuous Speculative
ConstraintsFreeze position/rotation on X, Y, Z axes

Force Application Modes

ModeUse Case
ForceContinuous force (mass-dependent, applied over time)
AccelerationContinuous acceleration (ignores mass)
ImpulseInstant force (mass-dependent, e.g. jump, explosion)
VelocityChangeInstant 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

TypeShapeBest ForPerformance
BoxColliderRectangularWalls, floors, cratesFast
SphereColliderSphereRolling objects, triggersFast
CapsuleColliderCapsuleCharacter bodiesMedium
MeshColliderArbitrary meshComplex static geometrySlow (Convex = faster)
WheelColliderSpecialisedVehicle wheelsMedium
TerrainColliderHeightmapTerrain surfacesMedium

Collider Tips

Triggers vs Colliders

AspectColliderTrigger
Physical responseYes (bounce, push, stop)No (overlap only)
CallbackOnCollisionEnter/Stay/ExitOnTriggerEnter/Stay/Exit
Use caseWalls, floors, physics objectsPickup zones, damage areas, checkpoints
SettingIs Trigger = falseIs 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

ModeDescriptionWhen to Use
DiscreteChecks at fixed intervalsSlow-moving objects
ContinuousSweeps collider against static geometryFast-moving player vs static world
Continuous DynamicSweeps against all collidersFast-moving dynamic objects (bullets)
Continuous SpeculativeBroad-phase sweep, then speculative contactsKinematic bodies, many fast objects

Tunnelling Prevention

Layer-Based Collision Matrix

Configure in Edit → Project Settings → Physics → Layer Collision Matrix.

PatternSetup
Player ignores other playersUntick Player/Player cell
Bullets only hit enemies + wallsTick Bullet/Enemy + Bullet/Environment
Triggers ignore visualsTick 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

PropertyDescription
Dynamic FrictionFriction while moving (0–1)
Static FrictionFriction to start moving (0–1)
BouncinessRestitution (0 = no bounce, 1 = perfect bounce)
Friction CombineAverage / Minimum / Maximum / Multiply
Bounce CombineAverage / 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