hace 2 años
En el corazón del desarrollo en Unity se encuentra MonoBehaviour, la clase base fundamental para todos los scripts en C#. Comprender el ciclo de vida de MonoBehaviour es crucial para cualquier desarrollador que busque crear juegos eficientes y bien estructurados. Este ciclo de vida define el orden en que se ejecutan las funciones predefinidas dentro de un script MonoBehaviour, permitiendo a los desarrolladores controlar el comportamiento de sus objetos en diferentes etapas del juego. En este artículo, exploraremos en detalle cada una de estas funciones, proporcionando una guía completa para dominar el ciclo de vida de MonoBehaviour y optimizar tus proyectos en Unity.

- Fases del Ciclo de Vida MonoBehaviour
- 1. Inicialización
- 2. Habilitación y Deshabilitación del Script
- 3. Inicio del Frame
- 4. Update Loop (Bucle de Actualización)
- 5. Renderizado
- 6. Eventos GUI
- 7. Eventos de Input (Entrada)
- 8. Eventos de Física (Física 3D y 2D)
- 9. Eventos de Animación
- 10. Eventos de Partículas
- 11. Eventos de Audio
- 12. Eventos de Aplicación
- 13. Eventos de Red (Networking - Sistema Antiguo)
- 14. Eventos de Transform
- 15. Destrucción
- Tabla Resumen del Ciclo de Vida MonoBehaviour
- Preguntas Frecuentes (FAQ) sobre MonoBehaviour
- Conclusión
Fases del Ciclo de Vida MonoBehaviour
El ciclo de vida de MonoBehaviour se puede dividir en varias fases, cada una con funciones específicas que se ejecutan en momentos determinados. A continuación, detallaremos cada una de estas fases y las funciones asociadas, agrupándolas para una mejor comprensión:
1. Inicialización
Esta fase se encarga de preparar y configurar el script y el objeto de juego antes de que comience el juego o la escena. Las funciones principales en esta fase son:
- Awake: Esta función es la primera en ejecutarse cuando se carga una instancia de script habilitada. Awake se llama incluso si el script está deshabilitado. Es ideal para inicializar variables, realizar configuraciones iniciales que no dependen de otros scripts y buscar componentes mediante
GetComponent. Es importante destacar que Awake se ejecuta siempre antes de cualquier función Start. - Reset: Reset se utiliza principalmente en el editor. Unity llama a Reset cuando se adjunta el script por primera vez a un objeto, o cuando se invoca la función 'Reset' en el menú contextual del componente en el Inspector. Esta función sirve para restablecer los valores de las propiedades a sus valores predeterminados, facilitando la configuración inicial de un componente.
- OnValidate: Esta función, exclusiva del editor, se llama cuando el script se carga o cuando se modifica un valor en el Inspector. OnValidate es útil para realizar validaciones en tiempo real de las propiedades del script en el editor, asegurando que los valores introducidos sean correctos o para actualizar otros valores dependientes en base a los cambios.
2. Habilitación y Deshabilitación del Script
Estas funciones se encargan de gestionar el estado activo del script. Son llamadas cuando el script se activa o desactiva, ya sea al inicio, durante la ejecución o manualmente.
- OnEnable: OnEnable se llama cuando el objeto se activa y se habilita. Esta función se ejecuta justo después de Awake cuando un objeto se instancia en la escena, o cuando se habilita un componente desactivado. Es un buen lugar para suscribirse a eventos o inicializar funcionalidades que dependen de que el objeto esté activo.
- OnDisable: OnDisable se llama cuando el comportamiento se deshabilita o se desactiva. Esto puede ocurrir al final de la vida de la escena (antes de OnDestroy), o cuando se desactiva el GameObject o el componente del script. Es importante utilizar OnDisable para desuscribirse de eventos y liberar recursos que ya no son necesarios mientras el script está inactivo, previniendo posibles fugas de memoria o errores.
3. Inicio del Frame
Esta fase marca el inicio de cada frame de renderizado. La función principal aquí es:
- Start: Start se llama justo antes de la primera actualización de frame si el script está habilitado. A diferencia de Awake, Start se llama solo si el script está activo. Se utiliza para realizar inicializaciones que dependen de otros scripts o componentes, ya que se garantiza que todos los Awake de todos los scripts se han ejecutado antes de cualquier Start. Si necesitas acceder a componentes de otros scripts, es mejor hacerlo en Start que en Awake.
4. Update Loop (Bucle de Actualización)
Esta es la fase más importante para la lógica del juego, ya que se ejecuta en cada frame. Dentro de esta fase, encontramos varias funciones que se ejecutan en un orden específico:
- FixedUpdate: FixedUpdate se llama en intervalos de tiempo fijos, independientemente de la velocidad de fotogramas. Esta función es crucial para la física y el movimiento basado en la física, ya que proporciona un paso de tiempo consistente, lo que resulta en simulaciones de física más predecibles y suaves. Es recomendable realizar todas las operaciones relacionadas con Rigidbody y físicas dentro de FixedUpdate.
- Update: Update se llama una vez por frame. Es la función más común para la mayoría de las actualizaciones del juego, como movimiento no físico, entrada de usuario, animaciones, comportamientos de la IA y lógica general del juego. La frecuencia de Update depende de la velocidad de fotogramas, por lo que puede variar.
- LateUpdate: LateUpdate se llama después de que se hayan completado todas las funciones Update en un frame. LateUpdate es útil para acciones que deben ocurrir después de que se hayan procesado todas las actualizaciones normales, como el movimiento de la cámara que sigue al personaje, para asegurar que la cámara se mueva después de que el personaje se haya movido en el mismo frame y evitar el “jittering” o temblores.
5. Renderizado
Esta fase se centra en todo lo relacionado con el renderizado de la escena. Las funciones aquí permiten controlar el proceso de renderizado y modificar la salida visual.
- OnPreCull: OnPreCull se llama justo antes de que una cámara realice el culling de la escena. El culling es el proceso de determinar qué objetos son visibles para la cámara y cuáles no. Esta función se puede utilizar para ajustar el comportamiento de culling si es necesario.
- OnBecameVisible: OnBecameVisible se llama cuando el renderizador se vuelve visible para cualquier cámara. Esto puede ser útil para activar comportamientos o efectos visuales cuando un objeto entra en el campo de visión de al menos una cámara.
- OnBecameInvisible: OnBecameInvisible se llama cuando el renderizador ya no es visible para ninguna cámara. Se utiliza para desactivar comportamientos, pausar animaciones o liberar recursos cuando un objeto está fuera de la vista, optimizando el rendimiento del juego.
- OnWillRenderObject: OnWillRenderObject se llama para cada cámara si el objeto es visible y no es un elemento de UI. Esto permite realizar acciones específicas para cada cámara que renderiza el objeto.
- OnPreRender: OnPreRender se llama justo antes de que una cámara comience a renderizar la escena. Se puede utilizar para configurar parámetros de renderizado específicos antes de que comience el proceso de renderizado.
- OnRenderObject: OnRenderObject se llama después de que una cámara ha renderizado la escena. Permite realizar renderizado personalizado sobre la escena renderizada, útil para dibujar gizmos personalizados o efectos de post-procesamiento básicos.
- OnPostRender: OnPostRender se llama después de que una cámara ha terminado de renderizar la escena. Similar a OnRenderObject, pero se ejecuta al final del proceso de renderizado de la cámara.
- OnRenderImage: OnRenderImage se llama después de que una cámara ha terminado de renderizar, permitiendo modificar la imagen final de la cámara. Es la función principal para implementar efectos de post-procesamiento en Unity, como filtros de color, desenfoque, distorsión, etc.
- OnDrawGizmos: OnDrawGizmos se implementa para dibujar gizmos en la vista de escena, incluso cuando el objeto no está seleccionado. Los gizmos son ayudas visuales en el editor que facilitan la visualización y manipulación de objetos. Los gizmos dibujados con OnDrawGizmos son pickable y siempre se dibujan.
- OnDrawGizmosSelected: OnDrawGizmosSelected se implementa para dibujar gizmos solo cuando el objeto está seleccionado en el editor. Permite mostrar información adicional o gizmos más detallados solo cuando es necesario, manteniendo la vista de escena más limpia cuando no se necesita.
6. Eventos GUI
Esta fase se encarga de la interfaz gráfica de usuario (GUI) antigua de Unity (OnGUI). Aunque el sistema de UI actual (UI Canvas) es más común, OnGUI todavía puede ser útil en ciertos casos.
- OnGUI: OnGUI se llama para renderizar y manejar eventos de GUI. Se ejecuta varias veces por frame, una vez por cada evento de GUI. Es importante mantener el código dentro de OnGUI lo más eficiente posible para evitar afectar el rendimiento del juego. Se utiliza principalmente para la GUI antigua de Unity, pero aún puede ser útil para herramientas de desarrollo o depuración en el juego.
7. Eventos de Input (Entrada)
Estas funciones se activan en respuesta a la interacción del usuario con el juego a través del ratón.

- OnMouseDown: OnMouseDown se llama cuando el usuario presiona el botón izquierdo del ratón mientras el cursor está sobre el Collider del objeto.
- OnMouseDrag: OnMouseDrag se llama cuando el usuario ha hecho clic en un Collider y sigue manteniendo presionado el botón del ratón.
- OnMouseEnter: OnMouseEnter se llama cuando el cursor del ratón entra en el Collider del objeto.
- OnMouseExit: OnMouseExit se llama cuando el cursor del ratón ya no está sobre el Collider del objeto.
- OnMouseOver: OnMouseOver se llama en cada frame mientras el cursor del ratón está sobre el Collider del objeto.
- OnMouseUp: OnMouseUp se llama cuando el usuario ha soltado el botón del ratón.
- OnMouseUpAsButton: OnMouseUpAsButton se llama solo cuando el botón del ratón se suelta sobre el mismo Collider donde se presionó inicialmente. Es útil para detectar clics de botón en objetos 3D.
8. Eventos de Física (Física 3D y 2D)
Estas funciones se activan cuando ocurren colisiones y eventos relacionados con la física, tanto en 3D como en 2D.
Física 3D
- OnCollisionEnter: OnCollisionEnter se llama cuando este collider/rigidbody ha comenzado a tocar otro rigidbody/collider. Se llama solo una vez al inicio de la colisión.
- OnCollisionStay: OnCollisionStay se llama una vez por frame por cada Collider o Rigidbody que toca otro Collider o Rigidbody. Se llama mientras la colisión persiste.
- OnCollisionExit: OnCollisionExit se llama cuando este collider/rigidbody ha dejado de tocar otro rigidbody/collider. Se llama una vez al final de la colisión.
- OnControllerColliderHit: OnControllerColliderHit se llama cuando un controlador de personaje (CharacterController) golpea un collider mientras realiza un movimiento (Move).
Física 2D
- OnCollisionEnter2D: Similar a OnCollisionEnter pero para física 2D. Se llama cuando un collider entrante hace contacto con el collider de este objeto (solo física 2D).
- OnCollisionStay2D: Similar a OnCollisionStay pero para física 2D. Se llama en cada frame donde un collider de otro objeto está tocando el collider de este objeto (solo física 2D).
- OnCollisionExit2D: Similar a OnCollisionExit pero para física 2D. Se llama cuando un collider en otro objeto deja de tocar el collider de este objeto (solo física 2D).
Triggers (Disparadores) 3D y 2D
- OnTriggerEnter: OnTriggerEnter se llama cuando otro GameObject entra en el trigger. Los triggers son colliders que no generan colisiones físicas, sino que detectan cuando otros colliders entran en su área.
- OnTriggerStay: OnTriggerStay se llama una vez por actualización de física para cada Collider que está tocando el trigger.
- OnTriggerExit: OnTriggerExit se llama cuando el Collider “otro” ha dejado de tocar el trigger.
- OnTriggerEnter2D, OnTriggerStay2D, OnTriggerExit2D: Versiones 2D de las funciones de trigger, con la misma funcionalidad pero para el sistema de física 2D.
9. Eventos de Animación
Estas funciones se relacionan con el sistema de animación de Unity, permitiendo controlar y reaccionar a eventos de animación.
- OnAnimatorIK: OnAnimatorIK es un callback para configurar IK (Inverse Kinematics) de animación. IK se utiliza para controlar la posición y rotación de ciertas partes de un personaje, como manos y pies, de forma más intuitiva.
- OnAnimatorMove: OnAnimatorMove es un callback para procesar movimientos de animación para modificar el movimiento de raíz (root motion). Permite a las animaciones influir en el movimiento del GameObject en el espacio.
10. Eventos de Partículas
Estas funciones se llaman en respuesta a eventos del sistema de partículas de Unity.
- OnParticleCollision: OnParticleCollision se llama cuando una partícula golpea un Collider.
- OnParticleSystemStopped: OnParticleSystemStopped se llama cuando todas las partículas del sistema han muerto y no se crearán nuevas partículas.
- OnParticleTrigger: OnParticleTrigger se llama cuando alguna partícula en un sistema de partículas cumple las condiciones en el módulo de trigger.
- OnParticleUpdateJobScheduled: OnParticleUpdateJobScheduled se llama cuando se ha programado el trabajo de actualización incorporado de un sistema de partículas.
11. Eventos de Audio
Esta función permite implementar filtros de audio personalizados en la cadena de procesamiento de audio de Unity.
- OnAudioFilterRead: Si se implementa OnAudioFilterRead, Unity insertará un filtro personalizado en la cadena DSP de audio. Permite modificar directamente el buffer de audio antes de que se reproduzca.
12. Eventos de Aplicación
Estas funciones responden a eventos relacionados con el ciclo de vida de la aplicación en sí, como la pausa, el foco o el cierre.

- OnApplicationFocus: OnApplicationFocus se envía a todos los GameObject cuando el jugador gana o pierde el foco de la aplicación.
- OnApplicationPause: OnApplicationPause se envía a todos los GameObject cuando la aplicación en ejecución se pausa o se reanuda al perder o recuperar el foco. Es importante gestionar la pausa del juego y la liberación de recursos en OnApplicationPause.
- OnApplicationQuit: OnApplicationQuit se envía a todos los GameObject antes de que la aplicación se cierre. Se utiliza para guardar datos del juego, liberar recursos globales y realizar tareas de limpieza final antes de que termine la aplicación. OnApplicationQuit solo se llama en builds standalone (no en el editor).
13. Eventos de Red (Networking - Sistema Antiguo)
Estas funciones están relacionadas con el antiguo sistema de networking de Unity (UnityEngine.Network). Para proyectos nuevos, se recomienda utilizar el nuevo sistema Unity Networking (UNet) o Netcode for GameObjects.
- OnConnectedToServer: OnConnectedToServer se llama en el cliente cuando se ha conectado correctamente a un servidor.
- OnFailedToConnect: OnFailedToConnect se llama en el cliente cuando un intento de conexión falla por alguna razón.
- OnServerInitialized: OnServerInitialized se llama en el servidor cuando se ha invocado y completado Network.InitializeServer.
14. Eventos de Transform
Estas funciones se llaman cuando la jerarquía del Transform del GameObject cambia.
- OnTransformChildrenChanged: OnTransformChildrenChanged se llama cuando la lista de hijos del Transform del GameObject ha cambiado.
- OnTransformParentChanged: OnTransformParentChanged se llama cuando un padre directo o indirecto del Transform del GameObject ha cambiado.
15. Destrucción
La fase final del ciclo de vida ocurre cuando el objeto o el script se destruye.
- OnDestroy: OnDestroy se llama cuando se destruye el GameObject que contiene el script o cuando se descarga la escena. Es la última función que se llama en el ciclo de vida de un script. OnDestroy es crucial para liberar cualquier recurso que el script haya asignado, como instancias de objetos, desuscribirse de eventos o realizar cualquier limpieza final antes de que el objeto sea eliminado de la memoria.
Tabla Resumen del Ciclo de Vida MonoBehaviour
Para una visión más clara, aquí tienes una tabla resumen del orden de ejecución de las funciones de MonoBehaviour:
| Fase | Funciones | Descripción |
|---|---|---|
| Inicialización | Awake, Reset, OnValidate | Configuración inicial del script y objeto. |
| Habilitación/Deshabilitación | OnEnable, OnDisable | Gestión del estado activo del script. |
| Inicio del Frame | Start | Inicialización justo antes del primer frame. |
| Update Loop | FixedUpdate, Update, LateUpdate | Actualizaciones del juego en cada frame. |
| Renderizado | OnPreCull, OnBecameVisible, OnBecameInvisible, OnWillRenderObject, OnPreRender, OnRenderObject, OnPostRender, OnRenderImage, OnDrawGizmos, OnDrawGizmosSelected | Control del proceso de renderizado. |
| Eventos GUI | OnGUI | Renderizado y manejo de eventos GUI (sistema antiguo). |
| Eventos de Input | OnMouseDown, OnMouseDrag, OnMouseEnter, OnMouseExit, OnMouseOver, OnMouseUp, OnMouseUpAsButton | Respuesta a la interacción del ratón. |
| Eventos de Física | OnCollisionEnter/Exit/Stay (3D y 2D), OnTriggerEnter/Exit/Stay (3D y 2D), OnControllerColliderHit | Eventos de colisión y triggers. |
| Eventos de Animación | OnAnimatorIK, OnAnimatorMove | Control de animación y IK. |
| Eventos de Partículas | OnParticleCollision, OnParticleSystemStopped, OnParticleTrigger, OnParticleUpdateJobScheduled | Eventos del sistema de partículas. |
| Eventos de Audio | OnAudioFilterRead | Filtro de audio personalizado. |
| Eventos de Aplicación | OnApplicationFocus, OnApplicationPause, OnApplicationQuit | Ciclo de vida de la aplicación. |
| Eventos de Red | OnConnectedToServer, OnFailedToConnect, OnServerInitialized | Networking (sistema antiguo). |
| Eventos de Transform | OnTransformChildrenChanged, OnTransformParentChanged | Cambios en la jerarquía del Transform. |
| Destrucción | OnDestroy | Liberación de recursos y limpieza final. |
Preguntas Frecuentes (FAQ) sobre MonoBehaviour
¿Cuándo debo usar MonoBehaviour?
MonoBehaviour se utiliza como clase base para cualquier script en Unity que necesite interactuar con el motor del juego, acceder a las funciones del ciclo de vida, manipular GameObjects, componentes, o utilizar las APIs de Unity. Casi todos los scripts de lógica de juego en Unity heredarán de MonoBehaviour.

MonoBehaviour offers life cycle functions that make it easier to develop with Unity. MonoBehaviours always exist as a Component of a GameObject, and can be instantiated with GameObject. AddComponent. Objects that need to exist independently of a GameObject should derive from ScriptableObject instead. ¿Por qué mi MonoBehaviour no se ve de color verde en mi editor de código?
El color verde de MonoBehaviour en algunos editores de código como Visual Studio Code generalmente indica reconocimiento de sintaxis por parte del IDE. Si MonoBehaviour no se muestra en verde, es posible que el editor de código no esté correctamente asociado al proyecto de Unity. Para solucionar esto en Visual Studio Code, asegúrate de que la carpeta raíz de tu proyecto de Unity esté abierta en VS Code. A veces, reinstalar o configurar correctamente las extensiones de C# para Unity en tu editor también puede resolver problemas de reconocimiento de sintaxis.
¿Cuál es la estructura de MonoBehaviour en Unity?
La estructura de MonoBehaviour en Unity se define principalmente por su ciclo de vida. No hay una estructura rígida en términos de variables o funciones obligatorias, pero la clave es entender y utilizar las funciones del ciclo de vida (como Awake, Start, Update, FixedUpdate, OnDestroy, etc.) para organizar la lógica del script en las diferentes etapas de ejecución del juego. Una buena práctica es dividir la lógica en funciones más pequeñas y utilizar las funciones del ciclo de vida para coordinar la ejecución de estas funciones en el momento adecuado.
¿Es necesario usar todas las funciones del ciclo de vida de MonoBehaviour en cada script?
No, no es necesario implementar todas las funciones del ciclo de vida en cada script. Solo debes usar las funciones que sean relevantes para la funcionalidad específica de ese script. Por ejemplo, si un script solo necesita inicializar variables al inicio, puedes usar solo Awake o Start. Si necesitas lógica que se ejecute en cada frame, usarás Update. Utilizar solo las funciones necesarias ayuda a mantener el código más limpio y eficiente.
Conclusión
Dominar el ciclo de vida de MonoBehaviour es fundamental para el desarrollo efectivo en Unity. Comprender cuándo y en qué orden se ejecutan las diferentes funciones te permite escribir scripts más organizados, eficientes y con menos errores. Al aprovechar las distintas fases del ciclo de vida, puedes controlar con precisión el comportamiento de tus objetos en cada etapa del juego, desde la inicialización hasta la destrucción. Esperamos que esta guía completa te haya proporcionado una comprensión profunda del ciclo de vida de MonoBehaviour y te ayude a optimizar tus futuros proyectos en Unity.
