Quick answer: Add a Rigidbody (Kinematic if you don’t want gravity) to at least one collider in the pair. Static-vs-static doesn’t emit events. Trigger pairs also need a Rigidbody.
Two pre-placed colliders touch — OnCollisionEnter never fires. PhysX considers them both static and skips event dispatch.
The Symptom
Collision script attached, both objects have colliders, they visibly overlap, no callback. Adding a Rigidbody fixes it.
The Fix
// Wall (no Rigidbody)
- BoxCollider
// Door (needs callback)
- BoxCollider
- Rigidbody (isKinematic = true, useGravity = false)
Door now counts as Kinematic Rigidbody for physics. Touching the wall fires OnCollisionEnter on door’s scripts.
Trigger Variant
// Pickup zone
- BoxCollider (isTrigger = true)
- Rigidbody (isKinematic = true)
// Player
- CharacterController OR Rigidbody + Collider
Trigger needs a Rigidbody on at least one side. CharacterController internally uses physics so it counts as the moving party.
Verifying
Print on OnCollisionEnter / OnTriggerEnter. With Rigidbody added: fires. Without: silent.
“Rigidbody on one side. Kinematic if no gravity. Callbacks fire.”
Related Issues
For OnTriggerExit on disable, see trigger exit. For Rigidbody sleep, see sleep waking.
Add a body. Events fire.