Sahneler arasında düzgün yükleme ekranı


14

Bir sonraki sahne yüklenirken bir yükleme animasyonu görüntülemek için bir yükleme ekranı oluşturdum. Bir sonraki sahneyi eşzamansız olarak yüklüyorum:

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

Ve ayrıca ayarlandı Application.backgroundLoadingPriority = ThreadPriority.Low;, ancak davranış hala normal bir seviye yükü ile aynı.

Bir şey mi kaçırıyorum?

Beklenen davranış:

  • Seviyeden çıkın ve kaybolun.
  • Yükleme ekranı belirir.
  • Yükleme tamamlandığında, yükleme ekranını yavaşça kaldırın.
  • Bir sonraki sahnede kaybolur.

Ne oluyor:

  • Seviyeden çıkın ve kaybolun.
  • Yükleme ekranı görünüyor, donmuş
  • Aniden yeni sahne kaybolur.

Yük başladığında, oyun normal Sahne yükünde olduğu gibi donar.

Ayarlamanız gerektiğini okudum allowSceneActivation = false, böylece yükleme ekranını yavaşlatabilir ve daha sonra truebirliğin yüklemeyi bitirmesine izin verecek şekilde ayarlayabilirsiniz , ancak bu tamamlanmayan, zaman uyumsuz işlemin yüklemeyi asla bitirmemesi gibi oyunumu dondurur.


Bu sorunu yaşadım ve burada hiçbir şey bulamadım. Google'dan sonra bu soruna neyin neden olduğunu öğrendim. Başkalarını kolayca bulabilmek için buraya göndermeye karar verdim. Cevabım / soruma biraz gelişme ekleyip eklemeyeceğinizi lütfen bize bildirin. Teşekkürler!
Leo

Yanıtlar:


18

Bir sahneyi yüklediğinizde SceneManager.LoadSceneAsync()aslında iki şey oluyor:

  • Sahnenin gameObjects hafızaya yüklenir.
  • Sonra tüm sahne etkinleştirilir. Sahnedeki nesneler için tüm Awake () ve Start () geri çağrıları çağrılır.

Sahneyi etkinleştirmek için ikinci adım, aslında birliği donduran şeydir, çünkü birlik, komut dosyalarınızdaki tüm başlatma geri çağrılarını tek bir döngüde çalıştırmaktadır.

Nitekim ayarı SceneManager.LoadSceneAsync().allowSceneActivationiçin falsezaman uyumsuz işlem sürecinin sadece ilk adımı tamamlamak için ve şekilde ayarlanmış kadar bekleyecek yapacak truesürecin ikinci bölümünü başlayacak.

Belirlediğiniz Ama eğer allowSceneActivationhiç falseve bunun gibi geri arama verimi, sen iyi oyununuzu donacak:

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

//Fade the loading screen out here

AO.allowSceneActivation = true;

Neden? Async işlemine sahne yükünün ikinci adımına devam etmemesini söylediğiniz için işlem hiçbir zaman tamamlanmayacaktır.

İşlemin ilk bölümünün ne zaman hazır olduğunu bilmek istiyorsanız, ikincisine devam etmek için güvenmeniz gerekir AsyncOperation.progress. Bu değer 0.9f, allowSceneActivationbayrağı beklerken hemen durur .

Bunun gibi bir şey olmalı:

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;

Sahne aktivasyonunun oyununuzu dondurmamasını istiyorsanız, Uyanış ve Başlangıç ​​geri aramalarınızı bir minimun olarak tutmalı ve komut dosyalarınızı birkaç döngü boyunca bir programda başlatmalısınız.


0

Aynı sorunu Unity 5.6'da yaşadım ve zaten getiri ifadelerini eklemeyi denemiştim. Unity'nin ana iş parçacığını engelleyen ve mevcut sahnenin herhangi bir yükleme ilerlemesini güzel bir şekilde göstermesini engelleyen LoadSceneAsync'in kendisiydi.

Anlayabildiğim kadarıyla Unity'de bir hata gibi görünüyor. Sahnem daha az karmaşık olduğunda, kodum harika ve sorunsuz bir şekilde çalıştı. Bir kez büyüdüğünde, Unity yaklaşık 6 saniye boyunca iş parçacığını engelledi, oysa operasyon "async" olduğu iddia edilen operasyona rağmen 'cevap vermiyor'

Sorunu çözme şeklim ışıklandırmaya bakmaktı. Aydınlatma ve bu özellik ile geçmişte büyük hatalar vardı. Bu yüzden nesnelerimi gözden geçirdim ve bir nesnede bir spot ışığı buldum (devre dışı bırakılmış olmasına rağmen ...)

Spot ışığı sildim ve yaşasın! Sahne düzgün bir şekilde zaman uyumsuz yükler! Kilitleme yok!


Düzenlemeden önce, bu yazı aslında soruna bir çözüm sunmadı. Şimdi bir düzeltme eklemeniz iyi, ancak gelecekte "Ben de bu sorunu yaşıyorum" demek istiyorsanız, bu amaçla cevapları kullanmamalısınız. Küçük bir temsilci kazanmak, mevcut gönderiler hakkında yorum yapmanıza veya yeni yanıtları teşvik etmek için sorulara bir ödül vermenize izin verecektir.
DMGregory
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.