Version: 2019.1
Attributes
Understanding Automatic Memory Management

Order of Execution for Event Functions

Running a Unity script executes a number of event functions in a predetermined order. This page describes those event functions and explains how they fit into the execution sequence.

Script lifecycle overview

The diagram below summarizes how Unity orders and repeats event functions over a script’s lifetime.

For more information about the various event functions, see the following sections:

Script lifecycle flowchart

Nota: Algunos navegadores no son compatibles con los archivos de imagen SVG. Si la imagen de arriba no se muestra correctamente (por ejemplo, si no puede ver ningún texto), intente con otro navegador, como Google Chrome o Mozilla Firefox.

First Scene load

Estas funciones son llamadas cuando la escena comienza (una para cada objeto en la escena).

  • Awake: Esta función siempre se llama antes de cualquier función Start y también justo después de que un prefab es instanciado. (Si un GameObject está inactivo durante el comienzo, Awake no es llamado hasta que se vuelva activo)
  • OnEnable: (solamente es llamado si el Objeto está activo): Esta función es llamada justo después de que el objeto es activado. Esto sucede cuando una instancia de MonoBehaviour es creada, tal como cuando un nivel es cargado o un GameObject con un componente script es instanciado.
  • OnLevelWasLoaded: Esta función es ejecutada para informarle al juego que un nuevo nivel ha sido cargado.

Tenga en cuenta que para todos los objetos agregados a la escena, las funciones Awake y OnEnable para todos los scripts serán llamados antes de que Start, Update, etc sean llamados en cualquiera de ellos. Naturalmente, esto no se puede lograr cuando un objeto es instanciado durante el gameplay.

Editor

  • Reset: El reset es llamado para inicializar las propiedades de script cuando es por primera vez adjuntado al objeto y también cuando el comando Reset es utilizado.

Before the first frame update

  • Start: Start es llamado antes de la primera actualización de frame solo si la instancia del script está activada.

Para objetos agregados a la escena, la función Start será llamada en todos los scripts antes que Update , etc sean llamadas para cualquier de ellos. Naturalmente, esto no puede suceder cuando un objeto es instanciado durante gameplay.

In between frames

  • OnApplicationPause: Esto es llamado al final del frame dónde la pausa es detectada, efectivamente entre actualizaciones de frame normales. Un frame extra será despachado después de que OnApplicationPause sea llamado para permitirle al juego mostrarle gráficas que indican el estado pausado.

Update Order

Cuando usted hace seguimiento de la lógica de juego y las interacciones, animaciones, posiciones de cámara, etc., hay unos eventos diferentes que usted puede utilizar. El patrón común es realizar la mayoría de tareas dentro de la función Update , pero también hay otras funciones que usted puede utilizar.

  • FixedUpdate: FixedUpdate a veces es más llamada que Update. Puede ser llamada varias veces por frame, si la velocidad de frame es baja y puede no ser llamada entre frames en absoluto si la velocidad de frame es alta. Todos los cálculos de física y actualizaciones ocurren inmediatamente después de FixedUpdate. Cuando aplique cálculos de movimiento dentro de FixedUpdate, usted no necesita multiplicar sus valores por Time.deltaTime. Esto se debe a que FixedUpdate en un temporizador fiable, independiente de la velocidad de frames.

  • Update: Update se llama una vez por frame. Es la función principal para las actualizaciones de frames.

  • LateUpdate: LateUpdate es llamada una vez por frame, después de que Update haya finalizado. Cualquier cálculo que sea realizado en Update será completado cuando LateUpdate comience. Un uso común para LateUpdate sería una cámara de tercera persona que sigue. Si usted hace que su personaje se mueva y gire, Update, usted puede realizar todos los cálculos de movimientos de cámara y rotación en LateUpdate. Esto asegurara que el personaje haya sido movido completamente antes de que la cámara haga un seguimiento a su posición.

Animation update loop

These functions and Profiler Markers are called when Unity evaluates the Animation system.

  • OnStateMachineEnter: During the State Machine Update step, this callback is called on the first update frame when a controller’s state machine makes a transition that flows through an Entry state. It is not called for a transition to a StateMachine sub-state.

    This callback occurs only if there is a controller component (for example, AnimatorController or AnimatorOverrideController or AnimatorControllerPlayable) in the animation graph.

    Note: Adding this callback to a StateMachineBehaviour component disables multithreaded state machine evaluation.

  • OnStateMachineExit: During the State Machine Update step, this callback is called on the last update frame when a controller’s state machine makes a transition that flows through an Exit state. It is not called for a transition to a StateMachine sub-state.

    This callback occurs only if there is a controller component (for example, AnimatorController or AnimatorOverrideController or AnimatorControllerPlayable) in the animation graph.

    Note: Adding this callback to a StateMachineBehaviour component disables multithreaded state machine evaluation.

  • Fire Animation Events: Calls all animation events from all clips sampled between the time of the last update and the time of the current update.

  • StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit): A layer can have up to 3 active states: current state, interrupted state, and next state. This function is called for each active state with a StateMachineBehaviour component that defines the OnStateEnter, OnStateUpdate, or OnStateExit callback.

    The function is called for the current state first, then the interrupted state, and finally the next state.

    This step occurs only if there is a controller component (for example, AnimatorController or AnimatorOverrideController or AnimatorControllerPlayable) in the animation graph..

  • OnAnimatorMove: Every update frame, this is called once for each Animator component to modify the Root Motion.

  • StateMachineBehaviour(OnStateMove): This is called on each active state with a StateMachineBehaviour that defines this callback.

  • OnAnimatorIK: Sets up animation IK. This is called once for each Animator Controller layer with IK pass enabled.

    This event executes only if you are using a Humanoid rig.

  • StateMachineBehaviour(OnStateIK): This is called on each active state with a StateMachineBehaviour component that defines this callback on a layer with IK pass enabled.

  • WriteProperties: Writes all other animated properties to the Scene from the main thread.

Useful profile markers

Some of the animation functions shown in the Script Lifecycle Flowchart are not Event functions that you can call; they are internal functions called when Unity processes your animation.

These functions have Profiler Markers, so you can use the Profiler to see when in the frame Unity calls them. Knowing when Unity calls these functions can help you understand exactly when the Event functions you do call are executed.

For example, suppose you call Animator.Play in the FireAnimationEvents callback. If you know that the FireAnimationEvents callback is fired only after the State Machine Update and Process Graph functions execute, you can anticipate that your animation clip will play on the next frame, and not right away.

  • State Machine Update: All state machines are evaluated at this step in the execution sequence. This step occurs only if there is a controller component (for example, AnimatorController or AnimatorOverrideController or AnimatorControllerPlayable) in the animation graph.

    Note: State machine evaluation is normally multithreaded, but adding certain callbacks (for example OnStateMachineEnter and OnStateMachineExit) disables multithreading. See Animation update loop above for details.

  • ProcessGraph: Evaluates all animation graphs. This includes sampling all animation clips that need to be evaluated, and computing Root Motion.

  • ProcessAnimation: Blends the results of the animation graph.

  • WriteTransforms: Writes all animated transforms to the scene from a worker thread.

    A Humanoid rig with multiple layers that have IK pass enabled can have multiple WriteTransforms passes (See the Script Lifecycle Flowchart.

Renderizado

  • OnPreCull: Llamado antes de que la cámara corte (culls) la escena . Culling determina qué objetos son visibles a la cámara. OnPreCull es llamado justo antes de que el culling tome lugar.
  • OnBecameVisible/OnBecameInvisible: Llamado cuando un objeto se vuelve visible/invisible a cualquier cámara.
  • OnWillRenderObject: Se llama una vez por cada cámara si el objeto es visible.
  • OnPreRender: Llamado antes de que la cámara comience a renderizar la escena.
  • OnRenderObject: Llamado después de que toda la renderización regular de la escena es hecha. Usted puede utilizar la clase GL o Graphics.DrawMeshNow para dibujar una geometría personalizada en este punto.
  • OnPostRender: Llamado después de que una cámara finalice de renderizar la escena.
  • OnRenderImage: Se invoca después de que se completa el rendering de escena para permitir el procesamiento posterior de la imagen , mire Efectos dPost-processing.
  • OnGUI: Llamado múltiples veces por frame en respuesta a los eventos GUI. El Layout y los eventos de Repaint son procesado primero, seguidos por un evento de Layout y de teclado/mouse para cada evento de input.
  • OnDrawGizmos Utilizado para dibujar Gizmos en la vista de escena por propósitos de visualización.

Coroutines

Actualizaciones normales de Coroutines (corrutinas) son ejecutadas después del return que hace la función Update. Una coroutine es una función que puede suspender su ejecución (yield) hasta que la YieldInstruction finalice. Diferentes usos de Coroutines:

  • yield La coroutine va a continuar después de que todas las funciones Update hayan sido llamadas en el siguiente frame.
  • yield WaitForSeconds Continúa después de un retraso de un tiempo específico, después de que todas las funciones Update hayan sido llamadas para el frame
  • yield WaitForFixedUpdate Continua después de que todos los FixedUpdate hayan sido llamadas en todos los scripts.
  • yield WWW Continúa después de que una descarga WWW haya sido completada
  • yield StartCoroutine Encadenada la coroutine, y va a esperar para que la coroutine MyFunc haya sido completado primero.

When the Object is destroyed

  • OnDestroy: Esta función es llamada después de que todas las actualizaciones de frame para el último frame de la existencia del objeto (el objeto puede ser destruido en respuesta a Object.Destroy o al cerrarse la escena).

When quitting

Estas funciones son llamadas en todos los objetos activos en su escena:

  • OnApplicationQuit: Esta función se llama en todos los game objects antes de que la aplicación se salga. En el editor se llama cuando el usuario para el modo de reproducción.
  • OnDisable: Esta función es llamada cuando el comportamiento se vuelve inactivo o deshabilitado.

Attributes
Understanding Automatic Memory Management