Loading ekranının oyunlar için görsellikten öte çok daha fazla anlamı bulunmaktadır. Bir sonraki scene'e geçtiğimiz zaman buradaki verilerin yüklenmesi zaman alır. Eğer ki oyunda biraz büyükse ana ekranda bir süre beklemesi kullanıcı üzerinde negatif etki yapabilir. Belli bir süreyi aşması durumunda ise yanıt vermiyor durumuna geçebilir. Hatta oyun crash verip kapanabilir. Android platformda size ANR olarak yansıyabilir. İnternette yükleme ekranı olarak mantıksız sadece görsel amaçla kullanılan loading ekranları görüyoruz. Biz bugün doğru bir gelişmiş, ileri düzey Loading ekranı yapımını öğreneceğiz. Haydi başlayalım o zaman.
İlk önce Hierarchy menüsünde boş bir GameObject oluşturalım. İsmine Loading adı verelim. Kendisine Inspector menüsünden bir Canvas Componenti ekleyelim. Yani Canvasın alt objesi olarak değil . Boş bir obje oluşturup Canvas Componenti ekleyerek yapıyoruz.
Buradaki Sort Order değerini 1 yapalım. Bunun nedeni normal bir Canvas objesi eklerseniz Sort Order değeri 0 olacaktır. Eğer bu değer büyük olursa o nesne daha önde görünür. Yani loading ekranı her zaman en önde görünecektir bu ayar sayesinde. Bundan sonra alta bir panel oluşturarak istediğiniz görünümü sağlayabilirsiniz. Artık kodlama kısmına bakalım. Bir Loading adında script oluşturup açalım.
İlk olarak scriptin en yukarı kısmına aşağıdaki reference'ı ekleyelim.
using UnityEngine.SceneManagement;
Daha sonra ise 2 değer tanımlıyoruz biri static değer, bu değer sayesinde objemize başka scenelere geçsek bile ulaşıp işlemimizi yapabileceğiz. Yani loading ekranını her scene geçişlerinde kullanabileceğiz. Diğer GameObject değerimiz ise loading ekranının görünmesini sağlayacak yani resmin.
public static Loading instance;
public GameObject panel_loading;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
Yukarıdaki kod ile yaptığımız işlem ise oluşturduğumuz Loading ekranını static değere kaydediyor yoksa hangi nesneyi yapacağımızı bilemez program. DontDestoyOnLoad ise bu objenin asla yok edilmemesini sağlıyor. Eğer yok olursa başka scene de loading ekranını bulamaz ve hata verir. Destroy kısmı ise birden çok loading ekranını oluşmasını engelliyor. Devam edelim. (Merak etmeyin bitmiş hallerini de paylaşacağım.)
Bu kısımda bir Load_Level_Asynch adında bir fonksiyon oluşturduk. Adını istediğiniz gibi siz belirleyebilirsiniz. Parantez içindeki name değeri hangi scene'i yani leveli yükleyeceğimizi belirtiyor. Fonksiyon içinde ise asıl işlemi yapan diğer fonksiyonu StartCoroutine yardımı ile çağırıyoruz. Ve tasarladığımız menüyü aktif hale getiriyoruz. Artık ekranda Loading resminiz ve yazınız var.
public void Load_Level_Asynch(string name)
{
StartCoroutine(LoadAsynch(name));
panel_loading.SetActive(true);
}
IEnumerator LoadAsynch(string name)
{
AsyncOperation operation = SceneManager.LoadSceneAsync(name);
while (!operation.isDone)
{
yield return null;
}
panel_loading.SetActive(false);
}
LoadAsynch kısmında ise SceneManager.LoadSceneAsync diyerek scene'imizi Asynchronous olarak yüklüyoruz. Yani bu işlemi arkaplan da yapıyoruz. Böylece bu işlem uzasa bile oyunumuz yanıt vermiyor hatası olmayacak crash atmayacak ve kapanmayacak. While kullanma nedenimiz ise işlemin devap edip etmediğini yani yeni scene'in levelin yüklenip yüklenmediğini kontrol etmek. Yüklenince döngüden çıkıp loading ekranını kapatıyoruz ve işlem tamam. Bu Loading scriptini başta oluşturduğumuz Loading adındaki boş objeye ekleyelim. Inspector üzerinde panel_loading değişkenine de tasarladığımız menüyü aktaralım.
Fark ettiysen alttaki Panel objesi yani tasarladığım menünün aktiflik değeri false. Başlangıçta bu şekilde durmalı zaten kod üzerinde düzenliyoruz.
Son olarak ise bu loading işlemini başlatmamız kaldı. Levelleri değiştirdiğimiz scripte gidip bu kod ile
işlemimizi yapabiliriz. İsterseniz buttonun click işlemine atayarak da istediğiniz sahneyi çağırabilirsiniz.
public void Go_To_Scene(string name)
{
Loading.instance.Load_Level_Asynch(name);
}
Sorularınızı , problemlerinizi belirtebilirsiniz yorum kısmında. Ayrıca desteklerinizi de bekliyorum.
Yorumlar
Yorum Gönder