Schermata di caricamento uniforme tra le scene


14

Ho creato una schermata di caricamento per visualizzare un'animazione di caricamento durante il caricamento della scena successiva. Carico la scena successiva in modo asincrono con:

yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive);

E anche impostato Application.backgroundLoadingPriority = ThreadPriority.Low;, ma il comportamento è sempre lo stesso di un carico di livello normale.

Mi sto perdendo qualcosa?

Comportamento previsto:

  • Esci dal livello e svanisci.
  • Viene visualizzata la schermata di caricamento.
  • Una volta terminato il caricamento, svuotare la schermata di caricamento.
  • Dissolvenza nella scena successiva.

Che cosa sta succedendo:

  • Esci dal livello e svanisci.
  • Viene visualizzata la schermata di caricamento, congelata
  • Improvvisamente la nuova scena si dissolve.

Una volta avviato il caricamento, il gioco si blocca, come con un normale caricamento di Scene.

Ho letto che devi impostare allowSceneActivation = false, in modo da poter svanire la schermata di caricamento, e quindi impostarlo in modo trueche l'unità finisca il caricamento, ma questo congela completamente il mio gioco, come se l'operazione asincrona non finisse mai di caricarsi.


Ho avuto questo problema e non ho trovato nulla qui. Dopo aver cercato su Google ho scoperto che cosa stava causando questo problema. Ho deciso di pubblicarlo qui in modo che altri possano trovare facilmente la risposta. Per favore fatemi sapere se aggiungereste qualche miglioramento alla mia risposta / domanda. Grazie!
Leone,

Risposte:


18

Quando carichi una scena con, in SceneManager.LoadSceneAsync()realtà accadono due cose:

  • Gli oggetti del gioco vengono caricati nella memoria.
  • Quindi l'intera scena è abilitata. Tutti i callback di Awake () e Start () verranno chiamati per gli oggetti nella scena.

Il secondo passo, abilitando la scena, è ciò che in realtà congela l'unità, poiché l'unità sta eseguendo tutti quei callback di inizializzazione nei tuoi script in un singolo ciclo.

Effettivamente l'impostazione SceneManager.LoadSceneAsync().allowSceneActivationsu falserenderà l'operazione asincrona per completare solo il primo passo del processo e attenderà fino a quando non è impostata trueper iniziare la seconda parte del processo.

Ma se si imposta allowSceneActivationper falsee rendimento del richiamata in questo modo, si congelare il tuo gioco per il bene:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
yield return AO;

//Fade the loading screen out here

AO.allowSceneActivation = true;

Perché? Perché stai dicendo all'operazione Async di non procedere con il secondo passaggio del caricamento della scena, quindi l'operazione non verrà mai completata.

Se vuoi sapere quando la prima parte dell'operazione è pronta, per procedere con la seconda devi fare affidamento AsyncOperation.progress. Questo valore si interromperà 0.9fimmediatamente in attesa della allowSceneActivationbandiera.

Dovrebbe essere qualcosa del genere:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
while(AO.progress < 0.9f)
{
    yield return null
}

//Fade the loading screen out here

AO.allowSceneActivation = true;

Se si desidera che l'attivazione della scena non blocchi il gioco, è necessario ridurre al minimo i callback di Awake and Start e inizializzare gli script in un programma di routine attraverso diversi cicli.


0

Avevo lo stesso identico problema in Unity 5.6 e avevo già provato ad aggiungere le dichiarazioni di rendimento. Era lo stesso LoadSceneAsync che stava bloccando il thread principale di Unity e impedendo alla scena corrente di mostrare correttamente qualsiasi progresso di caricamento.

Sembrerebbe essere un bug in Unity per quanto ne so. Quando la mia scena era meno complessa, il mio codice funzionava perfettamente, con una transizione graduale. Una volta ingrandito, Unity ha bloccato il thread per circa 6 secondi, per tutto il tempo in cui il gioco si presenta come "non risponde" nonostante l'operazione sia presumibilmente "asincrona"

Il modo in cui ho risolto il problema era guardare la mia illuminazione. Ci sono stati enormi bug in passato con l'illuminazione e questa funzione. Quindi ho esaminato i miei oggetti e ho scoperto di avere un riflettore su un oggetto (anche se era disabilitato ...)

Ho cancellato i riflettori e evviva! La scena si carica correttamente in modo asincrono! Nessun blocco!


Prima della modifica, questo post non offriva effettivamente una soluzione al problema. Va bene ora che hai aggiunto una correzione, ma in futuro se vuoi dire "Ho anche questo problema" non dovresti usare le risposte a tale scopo. Guadagnare un piccolo rappresentante ti consentirà di commentare i post esistenti o di dare una taglia alle domande per incoraggiare nuove risposte.
DMGregory
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.