OnCollision events
How colliders can call events when they physically collide.
Read time 3 minutesLast updated 3 days ago
Collision events occur when two non-trigger colliders make contact.
Example uses for collision events include:
- When a projectile hits a target, destroy both the projectile and the enemy.
- When a player character touches a door, trigger an animation to open the door.
- When a player character touches a power-up, increase the player’s size.
Working with collision events primarily involves the following API functions:
- : Unity calls this function on each collider when two colliders first make contact.
Collider.OnCollisionEnter - : Unity calls this function on each collider once per physics update while two colliders are in contact.
Collider.OnCollisionStay - : Unity calls this function on each collider when two colliders cease contact.
Collider.OnCollisionExit
For collision events, at least one of the objects involved must have a dynamic physics body (that is, a Rigidbody or ArticulationBody that has Is Kinematic disabled). If both GameObjects in a collision are kinematic physics bodies, the collision does not call functions.
OnCollisionThe following example prints a message to the console when Unity calls each function.
using UnityEngine;using System.Collections;public class DoorObject : MonoBehaviour{ // “other” refers to the collider that is touching this collider void OnCollisionEnter (Collision other) { Debug.Log ("A collider has made contact with the DoorObject Collider"); } void OnCollisionStay (Collision other) { Debug.Log ("A collider is in contact with the DoorObject Collider"); } void OnCollisionExit (Collision other) { Debug.Log ("A collider has ceased contact with the DoorObject Collider"); }}
For examples of practical applications for events, refer to example scripts for collider events.
OnCollisionDetect colliders that are destroyed or disabled during contact
If you disable or destroy a collider while it touches another collider, Unity doesn't call for that pair of colliders.
OnCollisionExitPhysics backends report collision enter, stay, and exit, so Unity calls when the two colliders separate. Deactivation and destruction don't produce an exit event for two different reasons:
OnCollisionExit- If you disable a collider, or the GameObject it belongs to, the event would report a collider that's no longer in the simulation. Deactivating a GameObject also stops its scripts from receiving messages at all, unlike disabling a , which still receives collision events.
MonoBehaviour - If you destroy a collider, there's nothing left to report to. The destroyed object can't receive the event, and the that
Collisionsupplies describes a collider that no longer exists.OnCollisionExit
Unity does not call to store and maintain a record of every touching pair of colliders in the scene. Maintaining that record would cost CPU time and memory in every project and even in projects that would not need that record.
OnCollisionExitTo handle these cases, do one of the following:
- Clean up in or
MonoBehaviour.OnDisableon the object that leaves the scene.MonoBehaviour.OnDestroy - Record the contacts your project cares about and check them each physics update, in the same way as OnTrigger events.
- Subscribe to to read contacts from each simulation step, instead of relying on per-object messages, and decide for yourself how to interpret contacts that begin and end. Unity doesn't report every contact in the scene through this event: a collider contributes contacts only if you set
Physics.ContactEventtoCollider.providesContactson it, or it has atruewith anMonoBehaviourmethod attached. EnableOnCollisionStayon the colliders you want to track. Otherwise, your record is incomplete. EachprovidesContactsidentifies its colliders byContactPair, which lets you match contacts against your own records even after Unity destroys a collider.EntityId