Event Execution Order

Author: Michael Garforth

Game loop
The following all happens in a single loop, in the order specified Physics does not necessarily run each time, and can run multiple times

After an instantiation
For objects that were instantiated last game loop iteration:
 * Start

Physics loop
Physics is run in a loop, iterating over the following until physics has caught up to the current frame:
 * FixedUpdate
 * Physics simulation
 * OnCollisionEnter / OnCollisionStay / OnCollisionExit
 * OnTriggerEnter / OnTriggerStay / OnTriggerExit
 * WaitForFixedUpdate (Coroutines which yielded WaitForFixedUpdate will resume execution after the next physics iteration completes)

Update events
The rest of the events are run once per game loop iteration:
 * OnMouseDown / OnMouseUp / OnMouseDrag / OnMouseEnter / OnMouseExit / OnMouseOver
 * Update
 * WaitForSeconds / yield / yield return null (Coroutines which yielded one of these will resume execution here, with WaitForSeconds resuming after the defined time)
 * LateUpdate

Network

 * RPC methods
 * OnSerializeNetworkView

Rendering

 * OnPreCull
 * OnBecameVisible / OnBecameInvisible
 * OnWillRenderObject
 * OnPreRender
 * OnRenderObject
 * OnPostRender
 * OnRenderImage (Pro only)


 * OnGUI (Called multiple times. Layout then Repaint events are called first, followed by a Layout and keyboard/mouse event for each input event)
 * OnDrawGizmos (Only when scene is drawn, even if object is inactive)

Before the frame ends

 * WaitForEndOfFrame (Coroutines which yielded WaitForEndOfFrame will resume execution before the next game loop finishes)

First scene load
Repeated once per object:
 * Awake
 * OnEnable (If the object is active)

At the beginning of the next frame, per object:
 * Start

Before the level loads
Repeated once per active object, after the end of the current frame:
 * OnDisable

After level loads
Repeated once per scene object:
 * Awake
 * OnEnable (If the object is active)

Repeated once per active DontDestroyOnLoad object from last level:
 * OnEnable

Repeated once per active object: Please pay attention: OnLevelWasLoaded is NOT guaranteed to run before all of the Awake calls. In most cases it will, but in some might produce some unexpected bugs. If you need some code to be executed before Awake calls, use OnDisable instead.
 * OnLevelWasLoaded

When quitting
For all active objects:
 * OnApplicationQuit
 * OnDisable

Immediate events
These are all called immediately when certain functions are called (e.g. Instantiate, setting enabled):
 * Awake - called during MonoBehaviour instantiation
 * OnEnable / OnDisable - OnEnable called during MonoBehaviour instantiation
 * Reset - called when the script is reset (Editor Only)