Unity'de sahneyi asenkron nasıl yüklersiniz? Yükleme ekranı ve allowSceneActivation nasıl kullanılır?
Cevap
SceneManager.LoadSceneAsync, sahneyi arka planda yükleyerek oyunun donmasını engeller. Dönen AsyncOperation ile ilerleme izlenir; allowSceneActivation = false yapılırsa sahne hazır olduğunda aktivasyon bekletilir (ör. "devam etmek için dokun").
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using System.Collections;
public class LoadingScreen : MonoBehaviour
{
[SerializeField] Slider bar;
public void Load(string scene) => StartCoroutine(LoadRoutine(scene));
IEnumerator LoadRoutine(string scene)
{
AsyncOperation op = SceneManager.LoadSceneAsync(scene);
op.allowSceneActivation = false;
while (op.progress < 0.9f) // aktivasyon kapalıyken 0.9'da durur
{
bar.value = op.progress / 0.9f;
yield return null;
}
bar.value = 1f;
yield return new WaitForSeconds(0.3f); // isteğe bağlı
op.allowSceneActivation = true;
}
}Bilinmesi gerekenler:
allowSceneActivationfalse ikenprogress0.9'da takılır; bu normaldir. %90 sonrası aktivasyon aşamasıdır.- Aktivasyon sırasında tüm yeni nesnelerin
Awake/Start'ı ana thread'de çalışır; bu adım hâlâ spike yapabilir. Ağır başlatmayı birkaç kareye yaymak gerekir. - Additive yükleme (
LoadSceneMode.Additive) ile kalıcı bir "core" sahne (manager'lar, UI) tutulup seviyeler eklenip çıkarılabilir;UnloadSceneAsyncile boşaltılır. - Kullanılmayan asset'ler için
Resources.UnloadUnusedAssets()çağrılabilir. - Addressables kullanılıyorsa
Addressables.LoadSceneAsynctercih edilir.
Open-world tarzı oyunlarda bu yaklaşım, oyuncu yaklaştıkça bölgeleri additive yükleyip uzaklaştıkça boşaltan streaming sistemine dönüşür.
İlgili Unity & C# soruları
- Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?
- GetComponent çağrılarını neden önbelleğe almalısınız?
- Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?
- C# delegate, event ve UnityEvent arasındaki farklar nelerdir?
- Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?
- C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.