Posso eseguire il mio script di caricamento durante la schermata iniziale di Unity?


10

Posso caricare i dati in background mentre la schermata iniziale di Unity è attiva? Se é cosi, come?

Sto cercando di eseguire il codice durante la schermata iniziale, non solo di caricare risorse.

Non sono stato in grado di trovare alcuna informazione al riguardo in Google o nella Documentazione Unity .


2
Penso che Unity stia già caricando l'intera applicazione quando è visibile la schermata iniziale. Non penso che ciò che vuoi fare sia possibile, ma mi piacerebbe sbagliarmi questa volta.
Hellium,

2
Questo sembra un po 'un problema XY: perché vuoi caricare roba durante quella schermata?
doppelgreener,

1
Qualunque cosa tu metta nella prima scena del tuo gioco viene caricata mentre quella schermata iniziale è alzata, giusto? Quindi, non basterebbe includere il contenuto che si desidera caricare in quella prima scena (off-camera, disabilitato o semplicemente referenziato se non si desidera che quel contenuto sia visibile immediatamente)? O stai cercando di caricare contenuti da un'altra fonte, come un web server?
DMGregory

@DMGregory Ottimo punto. Ho aggiornato la domanda. Sto cercando di eseguire il codice.
Evorlor,

Comprendiamo che stai cercando di eseguire il codice (il caricamento degli script è necessariamente un codice), ma quale codice e perché? Hai un problema e hai deciso che la soluzione è quella di eseguire quel codice durante la schermata iniziale di Unity; perché?
doppelgreener,

Risposte:


9

Ho appena fatto alcuni test e ho scoperto che il costruttore di oggetti nella prima scena viene effettivamente chiamato mentre la schermata iniziale è ancora visualizzata.

Ecco alcuni tempi che ho misurato con un cronometro statico:

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

Quindi, sembra che possiamo attivare l'esecuzione di uno script quasi 3 secondi prima della fine della schermata iniziale (con le impostazioni predefinite) spegnendolo dal costruttore. Puoi provare ad attivare il tuo codice di caricamento (possibilmente sul suo thread) da lì.

Fai solo attenzione che questo viene probabilmente chiamato dal thread di caricamento, quindi poiché non siamo sul thread principale saremo un po 'più limitati con ciò che ci è permesso fare qui. Se stai tentando di fare una cosa specifica che non è supportata nel thread di caricamento, considera di pubblicare una nuova domanda con i dettagli della tua applicazione e possiamo provare a trovare una soluzione alternativa per quel caso.


1
3 secondi prima della fine, vuoi dire, un secondo prima dell'inizio?
Jacob,

Nei miei esperimenti, la mia sceneggiatura ottiene il suo primo Update()segno di spunta 2,9 secondi dopo l'attivazione del costruttore. Questo è tutto ciò che posso discernere con la strumentazione attuale.
DMGregory

2

La tua scommessa migliore è creare la tua schermata di caricamento e impostarla come scena iniziale. Quindi, da quella semplice scena, utilizzare Scene Manager per caricare la scena successiva in background, in modo asincrono .

Non riesco a trovare informazioni per confermarlo, ma dalla mia osservazione sembra che Unity stia caricando la scena iniziale mentre viene mostrata la schermata iniziale.

Su alcune piattaforme, il gioco inizia a funzionare prima che la schermata iniziale scompaia, se il caricamento è abbastanza veloce.

Tutto ciò può cambiare in qualsiasi momento, su qualsiasi piattaforma, su qualsiasi aggiornamento di versione. Non vi è alcuna garanzia che ciò sia coerente, quindi è meglio usare la propria schermata di caricamento.


Schermi a doppio carico è ciò che stai suggerendo?
Evorlor,

Essenzialmente sì. È il modo di farlo con Unity. Metti una schermata iniziale / di caricamento per il tuo gioco o qualche animazione con il logo dello studio mentre carica la scena successiva.
Stephane Hockenhull,

1
@Evorlor questo è ciò che faccio con il mio gioco e funziona perfettamente. Sebbene ciò non ti consenta di utilizzare il tempo impiegato dall'introduzione di Unity, poiché tale introduzione può essere piuttosto breve, puoi semplicemente creare una schermata di caricamento (comunque generica) e usarla per la tua.
John Hamilton,

-1

La risposta breve è no , non puoi farlo.

Entrambe le risposte sopra sono corrette in termini di gestione della scena. È possibile utilizzare Scene Manager per caricare la scena e poiché è asincrona è possibile eseguire altri codici in parallelo.

Guarda la documentazione di SceneManager.LoadScene per maggiori dettagli.

Il più vicino possibile per eseguire il codice il più velocemente possibile dopo l'inizio del gioco è eseguirlo dalla prima scena con un ingombro ridotto. Chiamiamola Splash Scene . L'unica cosa che contiene è l'immagine splash e il controller che esegue il codice necessario e carica un'altra scena.

Dal momento che ha un ingombro ridotto, si caricherà molto velocemente e renderà il tuo codice in esecuzione quasi istantaneamente. È quindi possibile fare ciò che si deve fare e caricare successivamente un'altra scena .

Un'altra cosa che puoi provare è rimuovere "splash screen" rimuovere tutte le immagini che vorresti visualizzare lì. Sarà solo un po 'più veloce poiché non verrà caricato inizialmente.

Quindi il flusso sarebbe qualcosa del genere:

  1. Schermata iniziale (nessuna immagine qui, rendila nera)
  2. Splash scene (ingombro ridotto con il codice iniziale e caricatore scena successivo)
  3. Intro scene (intro scene regolari)
  4. .... (altre scene come al solito)

Più piccola è la scena più veloce verrà caricata. Puoi usare qualcosa come il controller splash collegato a qualsiasi oggetto nella schermata Splash caricata .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.