Introduction
Collisions and triggers are core components of most Unity games. Whether it’s detecting when a player hits an enemy, opens a door, or collects a coin — trigger and collision events let you handle real-time interactions between GameObjects.
In this guide, you’ll learn:
- The difference between collisions and triggers
- How to use OnCollisionEnter, OnTriggerEnter, and related methods
- What components (like Collider and Rigidbody) are required
- Real-world use cases and best practices
Let’s break it down step-by-step
Colliders vs Triggers — What’s the Difference?
✅ Colliders
- Used for physical collisions
- GameObjects bounce or stop when they collide
- Must include a Rigidbody for dynamic physics
- Example: A car crashing into a wall
✅ Triggers
- Used for detection only, without physics reaction
- Pass through each other like “ghosts”
- Useful for pickups, zones, UI triggers, etc.
- Example: Player entering a healing zone
Required Components
| Component | Needed for Collision? | Needed for Trigger? |
|---|---|---|
| Collider | ✅ | ✅ |
| Rigidbody | ✅ (one object must have) | ✅ (for 3D trigger detection) |
isTrigger = true |
❌ | ✅ |
⚙️ Collision Detection Methods
These C# methods are built into Unity’s MonoBehaviour class:
OnCollisionEnter
Called when two colliders physically collide.
void OnCollisionEnter(Collision collision)
{
Debug.Log("Collided with: " + collision.gameObject.name);
}
OnTriggerEnter
Called when a GameObject enters a trigger collider.
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Debug.Log("Player entered the zone!");
}
}
✅ You can also use OnCollisionExit, OnTriggerExit, and their Stay variants.
Real-World Example: Coin Collection
Let’s create a simple trigger zone that destroys a coin when touched by the player:
public class Coin : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Debug.Log("Coin collected!");
Destroy(gameObject);
}
}
}
Make sure the coin has:
- A Collider with “Is Trigger” checked
- No Rigidbody (or use
isKinematic = trueif it has one)
And the player has:
- A Collider
- A Rigidbody
Unity Physics Flow Tips
- Triggers do not apply force — they’re for detection only.
- For collision physics like bouncing, use non-trigger colliders.
- Only one object in a collision must have a Rigidbody.
- Rigidbody on both objects? You’ll get more realistic physics behavior.
Pro Tips for Clean Event Handling
✅ 1. Use Tags
Assign tags like "Player", "Enemy", or "Pickup" for detection.
if (other.CompareTag("Pickup"))
✅ 2. Don’t Rely on Name Checks
Avoid this (not scalable):
if (other.name == "Player")
Use tags or component checking instead.
✅ 3. Separate Collision Logic
Avoid putting all logic in one script. Keep trigger behavior separate for each object when possible.
✅ 4. Use LayerMask for Filtering
if (((1 << other.gameObject.layer) & layerMask) != 0)
Let’s you restrict trigger events to specific layers.
❌ Common Mistakes to Avoid
- Forgetting to check “Is Trigger” for trigger zones
- Expecting trigger events without Rigidbody present
- Using
OnTriggerEnter2Dwith 3D colliders (or vice versa) - Handling all collisions in one script without delegation
Suggested Use Cases
- Enemy patrol detection zone → Trigger alert
- Damage player on spike trap → OnCollisionEnter
- Collect coins → OnTriggerEnter
- Portal to new scene → OnTriggerEnter + SceneManager.LoadScene()
Final Thoughts
Mastering Unity’s trigger and collision events unlocks powerful interactions for your game. From pickups and power-ups to damage systems and scene changes — understanding how physics and triggers work is essential.
Always remember:
- Use collisions for physical responses
- Use triggers for detection
- Set up your colliders and Rigidbody components correctly
Are you handling collisions like a pro — or are your objects passing through each other silently?