How to detect when scene is loaded in Unity?

Detectar Carga de Escenas y Timelines en Unity

hace 2 años

Valoración: 4.65 (6778 votos)

En el desarrollo de videojuegos con Unity, es fundamental comprender cómo gestionar el flujo del juego y la sincronización de eventos. Dos aspectos cruciales en este proceso son la detección de la carga de escenas y la activación de Timelines. Estos mecanismos nos permiten controlar cuándo inician ciertas acciones, animaciones o lógicas de juego en función de la progresión del usuario o de la narrativa que deseamos construir. En este artículo, exploraremos en detalle cómo abordar ambos desafíos, proporcionando una guía completa para que puedas implementarlos eficazmente en tus proyectos de Unity.

How to detect when scene is loaded in Unity?
Assign a custom callback to this event to get notifications when a Scene has loaded. Create a custom callback method to receive the notification and assign it to the SceneManager. sceneLoaded event. The callback must have the required signature, taking a Scene and a LoadSceneMode as input parameters.
Índice de Contenido

Detección de la Carga de Escenas en Unity

La gestión de escenas es un pilar fundamental en Unity. Cada escena representa un nivel, un menú, o cualquier sección distinta de tu juego. Saber cuándo una escena ha terminado de cargarse es vital para iniciar la lógica de juego específica de esa escena, como la colocación de personajes, el inicio de la música de fondo o la activación de elementos interactivos. Unity ofrece un sistema robusto para detectar este evento.

El evento SceneManager.sceneLoaded

Unity proporciona el evento SceneManager.sceneLoaded dentro de la clase SceneManager. Este evento se dispara automáticamente cada vez que una nueva escena se carga completamente. Para utilizarlo, debemos suscribir una función (un método) a este evento. Esta función se ejecutará automáticamente cuando el evento ocurra. Es una forma elegante y eficiente de gestionar la lógica de inicio de cada escena de manera independiente.

Implementación práctica

Para implementar la detección de carga de escena, generalmente creamos un script en C# que se encargue de suscribirse al evento SceneManager.sceneLoaded. Este script puede ser un componente de un objeto persistente en tu juego, como un GameManager, o incluso un objeto específico en la primera escena que se carga. Veamos un ejemplo conceptual:

Imagina que tienes un script llamado SceneLoader. Dentro de este script, en la función Start o Awake (funciones que Unity ejecuta al inicio del ciclo de vida del script), puedes escribir el siguiente código:

SceneManager.sceneLoaded += OnSceneLoaded;

Esta línea de código indica: "Suscríbete al evento sceneLoaded del SceneManager y cuando ocurra, ejecuta la función OnSceneLoaded". Ahora, necesitas definir la función OnSceneLoaded. Esta función debe tener una firma específica: debe aceptar dos parámetros: la escena que se ha cargado (de tipo Scene) y el modo de carga de la escena (de tipo LoadSceneMode).

Un ejemplo de la función OnSceneLoaded podría ser:

void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
Debug.Log("Escena cargada: " + scene.name);
// Aquí puedes colocar la lógica específica de inicio de la escena.
// Por ejemplo, inicializar personajes, activar la música, etc.
}

Dentro de esta función, puedes escribir cualquier código que necesites ejecutar al inicio de la escena. Es importante desuscribirse del evento SceneManager.sceneLoaded cuando ya no lo necesites, para evitar posibles fugas de memoria y comportamientos inesperados. Esto se hace generalmente en la función OnDestroy del script:

void OnDestroy()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}

Casos de uso comunes

  • Inicialización de la lógica de juego: Como mencionamos, es el uso más común. Asegura que el juego se inicie correctamente en cada escena.
  • Carga de datos específicos de la escena: Puedes cargar archivos de configuración, datos de nivel, o cualquier información necesaria para la escena que acaba de cargar.
  • Animaciones de transición: Puedes activar animaciones de entrada o salida al cambiar de escena, sincronizando la animación con la carga completa de la nueva escena.
  • Gestión de la música de fondo: Cambiar la música de fondo o iniciar la música adecuada para cada escena una vez que se ha cargado.

Activar Timelines en Unity

Las Timelines en Unity son una herramienta poderosa para crear secuencias cinemáticas, animaciones complejas, o incluso controlar eventos de juego de manera precisa a lo largo del tiempo. A menudo, queremos activar una Timeline en momentos específicos, como al inicio de una escena, al completar una tarea, o al interactuar con un objeto.

Métodos para activar Timelines

Existen varias maneras de activar una Timeline en Unity. La más directa es a través de scripting en C#.

Does Activision use Unity?
Financial Times reported that Unity's engine "powers some of the world's most lucrative mobile games", such as Pokémon Go and Activision's Call of Duty Mobile.

Activación por Scripting

Para activar una Timeline por script, primero necesitas obtener una referencia al componente PlayableDirector que controla tu Timeline. Este componente se encuentra en el GameObject que contiene tu Timeline.

Una vez que tienes la referencia al PlayableDirector, puedes utilizar diferentes métodos para controlarla:

  • Play(): Este método inicia la reproducción de la Timeline desde el principio.
  • Stop(): Detiene la reproducción de la Timeline.
  • Pause(): Pausa la reproducción de la Timeline.
  • Resume(): Reanuda la reproducción de una Timeline pausada.
  • time: Puedes acceder a la propiedad time para obtener o establecer el tiempo de reproducción actual de la Timeline. Esto permite, por ejemplo, saltar a un punto específico de la Timeline.

Un ejemplo sencillo de cómo activar una Timeline al inicio de una escena (utilizando la detección de carga de escena que vimos anteriormente) sería:

Primero, asegúrate de tener un PlayableDirector en tu escena y una Timeline asignada a él. Luego, crea un script (por ejemplo, TimelineActivator) y adjúntalo a un GameObject en tu escena. Dentro de este script, puedes escribir:

public PlayableDirector miTimelineDirector; // Asigna tu PlayableDirector desde el Inspector

void Start()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}

void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name == "NombreDeTuEscenaConTimeline") // Verifica si es la escena correcta
{
miTimelineDirector.Play(); // Inicia la Timeline
}
}

void OnDestroy()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}

En este ejemplo, la Timeline se iniciará automáticamente cuando se cargue la escena llamada "NombreDeTuEscenaConTimeline". Recuerda arrastrar y soltar tu componente PlayableDirector al campo miTimelineDirector en el Inspector del script TimelineActivator.

Activación mediante Playmaker (Proxy de Timeline)

Para aquellos que utilizan Playmaker, un popular plugin de programación visual para Unity, existe una forma de integrar Timelines con la lógica de Playmaker mediante un script proxy. Este método, descrito en la información proporcionada, permite disparar eventos de Playmaker desde la Timeline.

El proceso general implica:

  1. Añadir el script proxy a la Timeline: Se crea una nueva pista en la Timeline y se arrastra el script playmakerTimelineEvent.cs a esta pista.
  2. Configurar el script proxy: Al seleccionar el script en la Timeline, se mostrarán opciones en el Inspector. Aquí se debe especificar el GameObject que contiene el FSM de Playmaker (o seleccionar 'global' para enviar el evento a todos los FSM en la escena) y el nombre del evento de Playmaker que se desea disparar.
  3. Crear el evento en Playmaker: En el FSM de Playmaker, se debe crear un nuevo evento con el mismo nombre especificado en el script proxy de la Timeline. Luego, se añade una transición global a un estado utilizando este evento.

Cuando la Timeline alcance la posición del script proxy, se disparará el evento de Playmaker, permitiendo controlar el flujo de Playmaker desde la Timeline. Este método es útil para sincronizar animaciones de Timeline con la lógica de juego gestionada por Playmaker.

Preguntas Frecuentes (FAQ)

  1. ¿Puedo activar una Timeline desde otra Timeline?
    Sí, utilizando señales (Signals) dentro de la Timeline. Puedes crear una señal en una Timeline que, al activarse, desencadene la reproducción de otra Timeline.
  2. ¿Cómo puedo reiniciar una Timeline desde el script?
    Para reiniciar una Timeline, puedes detenerla con Stop() y luego volver a iniciarla con Play(). Si quieres asegurarte de que comience desde el tiempo 0, puedes establecer miTimelineDirector.time = 0; antes de llamar a Play().
  3. ¿Puedo controlar la velocidad de reproducción de una Timeline?
    Sí, utilizando la propiedad playableGraph.GetPlayableOutput(0).SetSpeed(velocidad); del PlayableDirector. 'velocidad' es un valor float que representa el multiplicador de velocidad (1 para velocidad normal, 0.5 para la mitad de velocidad, 2 para el doble de velocidad, etc.).
  4. ¿Es posible activar una Timeline al hacer clic en un objeto?
    Sí, puedes utilizar un componente Event Trigger en el objeto interactivo y configurar un evento 'Pointer Click'. En la función que se ejecute al hacer clic, puedes obtener la referencia al PlayableDirector de la Timeline que deseas activar y llamar a Play().

Conclusión

Dominar la detección de carga de escenas y la activación de Timelines son habilidades esenciales para cualquier desarrollador de Unity. La detección de carga de escenas permite una gestión organizada del flujo de juego y la inicialización adecuada de cada nivel o sección. Las Timelines, por su parte, ofrecen un control preciso sobre secuencias animadas y eventos temporales, enriqueciendo la narrativa y la interactividad de tus juegos. Al combinar estas técnicas, podrás crear experiencias de juego más dinámicas, inmersivas y profesionales en Unity. Recuerda experimentar y explorar las diferentes opciones para encontrar la solución que mejor se adapte a las necesidades específicas de tu proyecto.

Subir