Ciclo de vida de scripts en Unity

Resumen

Si alguna vez te preguntaste cómo lograr que un personaje reaccione a la lluvia o que un NPC venga a saludarte sin que se lo pidas, la respuesta empieza por entender el ciclo de vida de un script en Unity. Aquí verás qué es un script, cómo se convierte en componente y en qué orden se ejecutan sus mensajes principales, ideal si das tus primeros pasos como desarrollador de videojuegos.

¿Qué es un script en Unity y por qué es asset y componente a la vez?

Un script es un asset de código escrito en C# que hereda de MonoBehaviour. Vive en tu carpeta de proyecto como archivo, pero también puede añadirse a un GameObject y comportarse como componente con sus propias propiedades y métodos [00:48].

La analogía que ayuda es la del cortador de galletas: la clase es el cortador y la instancia es la galleta. Mientras tu archivo .cs está en disco, sigue siendo un asset. En el momento en que lo arrastras a un GameObject, ese mismo código se vuelve componente y empieza a recibir mensajes del objeto que lo contiene [01:39].

¿Qué es un script en Unity? Es un archivo de código C# que hereda de MonoBehaviour. Existe como asset en tu proyecto y se convierte en componente cuando lo añades a un GameObject.

¿Qué mensajes envía un GameObject a su componente?

Un GameObject le comunica al script eventos clave de su existencia: cuando despierta, cuando se activa, cuando pasa un frame, cuando recibe clic o cuando lo destruyen. Todo programador que trabaje con Unity debería conocer estos mensajes [02:25]:

  • Awake: se ejecuta antes de Start.
  • OnEnable / OnDisable: cuando el GameObject se activa o desactiva.
  • Start: una sola vez, la primera vez que el objeto se activa.
  • Update: una vez antes de pintar cada frame.
  • OnMouseDown: si el GameObject tiene collider y el usuario hace clic.
  • OnDestroy: cuando el objeto es destruido.
  • Reset: solo en el editor, al añadir el componente.

¿En qué orden se ejecuta el ciclo de vida de un script?

Los métodos siguen una secuencia predecible que conviene memorizar para evitar bugs raros al inicializar variables o referencias.

Al darle play, si el GameObject ya está activo, se disparan en este orden: Awake, OnEnable y Start [03:24]. Cuidado con OnEnable: si tienes varios GameObjects, la secuencia es por objeto (Awake, OnEnable, siguiente; Awake, OnEnable, siguiente). Recién cuando termina ese ciclo completo, se llama a Start en todos.

¿Cada cuánto se ejecuta el método Update?

Una vez antes de pintar cada frame. Puede correr hasta 60 veces por segundo, a veces más [04:24]. Piensa en él como una espera activa que no congela el ordenador y que se usa para lógica continua, como mover personajes o detectar inputs.

¿Cuándo se ejecuta OnMouseDown? Antes de pintar un frame y solo si el jugador hizo clic durante ese frame sobre un GameObject que tiene un collider asignado.

¿Qué pasa al detener el juego o destruir un objeto?

Al darle stop, al desactivar el GameObject o al destruirlo, se ejecutan OnDisable y OnDestroy, en ese orden [05:00]. El método Reset es la excepción del grupo: solo corre en el editor, justo cuando acabas de añadir el componente al GameObject.

¿Cómo crear un script en Unity paso a paso?

Mantener el proyecto ordenado es la primera regla. Lo recomendable es guardar todo dentro de una carpeta llamada Scripts [05:43]. Hay tres formas de crearlo:

  1. Desde el panel Project: clic derecho, Create, C# Script, y le pones nombre (por ejemplo, HolaMundo).
  2. Desde Add Component: con un GameObject seleccionado, escribes el nombre en la barra de búsqueda y eliges New Script. La desventaja es que se crea en la raíz y luego hay que moverlo manualmente a la carpeta Scripts [06:50].
  3. Creando el archivo directamente dentro de la carpeta Scripts. Es la forma favorita de muchos porque evita el reordenamiento posterior [07:55].

Las clases en C# se escriben con la primera letra en mayúscula y sin puntos ni símbolos en el nombre. Si intentas poner .cs manualmente, Unity te avisa.

¿Cómo editar el script con Visual Studio u otro editor?

Doble clic sobre el script abre el editor por defecto, que normalmente es Visual Studio Code o Visual Studio Community instalado junto con Unity. Puedes usar el editor que prefieras, incluso Emacs, si te resulta más cómodo [07:30].

¿Cómo probar Start, OnEnable y Update con Debug.Log?

Cuando creas un script nuevo, Unity ya te entrega una plantilla con los métodos Start y Update. La forma más rápida de ver el ciclo en acción es imprimir mensajes en consola con Debug.Log [08:39].

En C#, por convención, tanto las clases como los métodos llevan la primera letra en mayúscula. Por eso Start, Update y Log se escriben así.

¿Qué imprime cada método al ejecutar el juego?

Probando con un cubo al que le añades un script HolaMundo:

  • En Start un mensaje Hola, desperté aparece una sola vez al activarse por primera vez.
  • En OnEnable un mensaje Me activé aparece antes del Start y se repite cada vez que desactivas y vuelves a activar el componente o el GameObject [09:50].
  • En Update un mensaje spam llena la consola, porque corre cada frame. En una máquina rápida puedes ver hasta 100 mensajes por segundo [11:23].

Un truco útil: la consola colapsa mensajes repetidos por defecto. Puedes desmarcar esa opción y usar Clear para ver el comportamiento real frame a frame [10:38].

¿Qué crees que pasaría si pones un Debug.Log dentro de OnMouseDown? Cuéntamelo en los comentarios y nos vemos en la siguiente clase con OnDisable, Awake, OnDestroy y OnMouseDown.