Collision events occur when two non-trigger colliders make contact.
Example uses for collision events include:
Working with collision events primarily involves the following API functions:
Collider.OnCollisionEnter: Unity calls this function on each collider when two colliders first make contact.Collider.OnCollisionStay: Unity calls this function on each collider once per physics update while two colliders are in contact.Collider.OnCollisionExit: Unity calls this function on each collider when two colliders cease contact.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 OnCollision functions.
The 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 OnCollision events, refer to example scripts for collider events.
If you disable or destroy a collider while it touches another collider, Unity doesn’t call OnCollisionExit for that pair of colliders.
Physics backends report collision enter, stay, and exit, so Unity calls OnCollisionExit when the two colliders separate. Deactivation and destruction don’t produce an exit event for two different reasons:
MonoBehaviour, which still receives collision events.Collision that OnCollisionExit supplies describes a collider that no longer exists.Unity does not call OnCollisionExit 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.
To handle these cases, do one of the following:
MonoBehaviour.OnDisable or MonoBehaviour.OnDestroy on the object that leaves the scene.Physics.ContactEvent 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 Collider.providesContacts to true on it, or it has a MonoBehaviour with an OnCollisionStay method attached. Enable providesContacts on the colliders you want to track. Otherwise, your record is incomplete. Each ContactPair identifies its colliders by EntityId, which lets you match contacts against your own records even after Unity destroys a collider.