¿Puedo ejecutar mi propio script de carga durante la pantalla de inicio de Unity?

10

¿Puedo cargar datos en segundo plano mientras la pantalla de inicio de Unity está activa? ¿Si es así, cómo?

Estoy tratando de ejecutar código durante la pantalla de inicio, no solo cargar activos.

No he podido encontrar ninguna información sobre esto en Google o en la Documentación de Unity .

Evorlor
fuente
2
Creo que Unity ya está cargando toda su aplicación cuando la pantalla de inicio es visible. No creo que lo que quieras hacer sea posible, pero me encantaría estar equivocado esta vez.
Hellium
2
Esto parece un problema de XY: ¿por qué quieres cargar cosas durante esa pantalla?
doppelgreener
1
Todo lo que pones en la primera escena de tu juego se carga mientras la pantalla de bienvenida está activa, ¿verdad? Entonces, ¿no sería suficiente incluir el contenido que desea cargar en esa primera escena (ya sea fuera de cámara, desactivado o simplemente referenciado si no desea que ese contenido sea visible de inmediato)? ¿O está intentando cargar contenido de otra fuente, como un servidor web?
DMGregory
@DMGregory Gran punto. Actualicé la pregunta. Estoy tratando de ejecutar el código.
Evorlor
Entendemos que está intentando ejecutar código (los scripts de carga son necesariamente código), pero ¿qué código y por qué? Tiene un problema y ha decidido que la solución es ejecutar ese código durante la pantalla de inicio de Unity; ¿porqué es eso?
doppelgreener

Respuestas:

9

Acabo de hacer algunas pruebas y descubrí que en realidad se llama al constructor de objetos en la primera escena mientras todavía se muestra la pantalla de presentación.

Aquí hay algunos tiempos que medí con un cronómetro estático:

Constructed  0     s
Awake        2.118 s
OnEnable     2.12  s
Start        2.744 s
First Update 2.919 s

Por lo tanto, parece que podemos activar un script para que se ejecute casi 3 segundos antes del final de la pantalla de inicio (con la configuración predeterminada) disparándolo desde el constructor. Puede intentar activar su código de carga (posiblemente en su propio hilo) desde allí.

Solo tenga en cuenta que esto probablemente se llama desde el hilo de carga, por lo que dado que no estamos en el hilo principal, estaremos un poco más limitados con lo que se nos permite hacer aquí. Si hay algo específico que intenta hacer que no se admite en el hilo de carga, considere publicar una nueva pregunta con detalles de su aplicación y podemos intentar encontrar una solución para ese caso.

DMGregory
fuente
1
¿3 segundos antes del final, quieres decir, un segundo antes del comienzo?
Jacob
En mis experimentos, mi script obtiene su primer Update()tic 2.9 segundos después de que el constructor disparara. Eso es todo lo que puedo discernir con la instrumentación actual.
DMGregory
2

Su mejor opción es hacer su propia pantalla de carga y establecerla como la escena inicial. Luego, desde esa escena simple, use el Administrador de escenas para cargar la siguiente escena en segundo plano, de forma asincrónica .

No puedo encontrar información para confirmar esto, pero según mi observación, parece que Unity está cargando su escena inicial mientras se muestra la pantalla de inicio.

En algunas plataformas, el juego comienza a ejecutarse antes de que desaparezca la pantalla de inicio, si la carga es lo suficientemente rápida.

Todo esto puede cambiar en cualquier momento, en cualquier plataforma, en cualquier actualización de versión. No hay garantía de que esto sea consistente, por lo que es mejor usar su propia pantalla de carga.

Stephane Hockenhull
fuente
¿Pantallas de doble carga es lo que estás sugiriendo?
Evorlor
Esencialmente si. Es la forma de hacerlo con Unity. Coloque una pantalla de inicio / carga para su juego o alguna animación de logotipo de estudio mientras carga la siguiente escena.
Stephane Hockenhull
1
@Evorlor, esto es lo que hago con mi juego y funciona perfectamente bien. Aunque esto no le permite utilizar el tiempo que lleva la introducción de Unity, dado que esa introducción puede ser bastante corta, puede hacer una pantalla de carga (aunque sea genérica) y usarla para la suya.
John Hamilton
-1

La respuesta corta es no , no puedes hacer eso.

Ambas respuestas anteriores son correctas en términos de gestión de la escena. Puede usar Scene Manager para cargar la escena y, dado que es asíncrona, puede ejecutar otro código en paralelo.

Mire la documentación de SceneManager.LoadScene para más detalles.

Lo más cerca que puede llegar a ejecutar su código lo más rápido posible después de que comience el juego es ejecutarlo desde la primera escena con una huella pequeña. Llamémoslo Splash Scene . Lo único que contendría es que la imagen de bienvenida y el controlador ejecuten el código necesario y carguen otra escena.

Como tiene un tamaño reducido, se cargará muy rápido y, por lo tanto, su código se ejecutará casi al instante. Luego puede hacer lo que tiene que hacer y luego cargar Otra escena .

Otra cosa que puedes probar es eliminar la "pantalla de bienvenida", eliminar cualquier imagen que quieras mostrar allí. Será un poco más rápido ya que no se cargará inicialmente.

Entonces el flujo sería algo como esto:

  1. Pantalla de bienvenida (no hay imagen aquí, solo hazla negra)
  2. Splash scene (huella pequeña con su código inicial y el siguiente cargador de escena)
  3. Escena de introducción (escena de introducción normal)
  4. .... (otras escenas como siempre)

Cuanto más pequeña sea la escena, más rápido se cargará. Puede usar algo como el controlador de bienvenida adjunto a cualquier objeto en la pantalla de bienvenida cargada .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
IndieForger
fuente