It is really pretty simple. Let's assume that the collision starts, the colliders keep intersecting for a period of time (several frames), and after a while they separate again. The events then are:
- OnCollisionEnter for the first frame only, and never again until after an OnCollisionExit
- OnCollisionStay for the entire duration (all frames)
- OnCollisionExit for the last frame only
Even if its called once per frame, If I for example jump up in the air and hit a ceiling above me, is it still called?
Sure it is. But then for that new collision. If there is a period in between where you're not colliding with anything however, you will not get OnCollisionStay events for that duration.
To get a deeper understanding of these events, it's perhaps best to create a simple demo scene in which you manually intersect two colliders, and have some text written to the console for the various events.