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:

  • allowSceneActivation false iken progress 0.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; UnloadSceneAsync ile boşaltılır.
  • Kullanılmayan asset'ler için Resources.UnloadUnusedAssets() çağrılabilir.
  • Addressables kullanılıyorsa Addressables.LoadSceneAsync tercih 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.

  1. Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?KolayUnity & C#Game Dev
  2. GetComponent çağrılarını neden önbelleğe almalısınız?KolayUnity & C#Game Dev
  3. Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?OrtaUnity & C#Game Dev
  4. C# delegate, event ve UnityEvent arasındaki farklar nelerdir?OrtaUnity & C#Game Dev
  5. Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?ZorUnity & C#Game Dev
  6. C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?OrtaUnity & C#Game Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle