Hepinize yeniden merhabalar,

Bu dersimizde Unity için basit bir loading ekranı yapacağız. Bu loading ekranı ile scene’ler arası yumuşak bir şekilde geçiş (transition) yapabilecek ve sonraki sahnenin % kaçının yüklendiğini oyuncuya gösterebileceğiz.

O halde son gaz derse başlayalım…

İlk iş yeni bir sahne açalım ve GameObject-UI-Panel yolunu izleyerek sahnede bir panel oluşturalım. Panele “Arkaplan” ismini verelim. Bu paneli loading ekranının arkaplanı için kullanacağız. Bu derste arkaplanımız simsiyah olacak. O halde Panel’in Image component‘inin Color (renk) değerini siyah yapın ve A (alpha) değerini 255 yapın:

resim1

Son olarak da “Source Image” değişkeninin değerini None yapın çünkü arkaplan için referans bir resme ihtiyacımız yok, arkaplan sadece siyah renkten oluşacak.

Şimdi GameObject-UI-Text ile sahnede bir yazı oluşturun ve yazıya “Durum” ismini verin. Yazının rengini istediğiniz gibi değiştirin, ben beyaz yaptım. Ayrıca dilerseniz Add Component-UI-Effects-Outline yolunu izleyerek yazıya bir dış hat da ekleyebilirsiniz. Ben bu hatta mavi renk verdim:

resim2

Text component‘inin “Text” değişenine değer olarak “Yükleniyor %0” verin. Ardından anchor’lar ve font size ile oynayarak yazının ekranda kapladığı alanı genişletin zira şu anda yazı çok ufak. Benim yaptığım ayarlamalar şöyle:

resim3

Arayüzümüz neredeyse hazır. Hierarchy‘den Canvas objesini seçin ve Canvas component‘indeki “Sort Order“ı 100 yapın. Bir sahnede birden çok canvas varsa en üste sort order’ı büyük olan canvas çizilir. Biz loading ekranının daima en üstte olmasını istiyoruz.

Bence arayüzümüz tamamlandı. Şimdi bu arayüzü bir prefab‘a çevirelim. Neden diye sorabilirsiniz. Çünkü bu loading ekranından her sahneye bir tane koymakla uğraşmak istemiyorum. Ne zaman ki loading ekranını kullanacağız, o vakit bu prefab’ı kod vasıtasıyla Instantiate edeceğiz. Instantiate edebilmek için ise objeyi prefab yapmalıyız. O halde Project panelinde “Resources” adında yeni bir klasör oluşturun (sebebini kodu yazarken açıklayacağım) ve Canvas objesini Resources klasörünün içine sürükle-bırak yaparak bir prefab’a çevirin. Prefab’ın ismini “LoadingEkrani” yapın:

resim4

Kod yazmaya başlayabiliriz. “LoadingEkrani” adında yeni bir Javascript oluşturun ve içini şöyle değiştirin:

#pragma strict
 
import UnityEngine.UI;
 
// LoadingEkrani scriptine kolayca erisebilmek icin static degisken
private static var instance : LoadingEkrani = null;
 
public var panel : Image;
public var yazi : Text;
 
// Degeri arttikca yumusak gecis animasyonu hizlanir
public var animasyonHizi : float = 1.25;
 
// Level yukleme islemi
private var loadingIslemi : AsyncOperation;
 
// Yeni bir level yukle
public static function LevelYukle( levelAdi : String )
{
    // Eger sahnede bir LoadingEkrani yoksa yeni bir tane olustur
    if( instance == null )
    {
        instance = Instantiate( Resources.Load( "LoadingEkrani", GameObject ) ).GetComponent( LoadingEkrani );
        DontDestroyOnLoad( instance.gameObject ); // Loading ekrani sahneler arasi geciste kaybolmasin
    }
     
    // Loading ekranini aktiflestir
    instance.gameObject.SetActive( true );
    // Yeni leveli yuklemeye basla
    instance.loadingIslemi = Application.LoadLevelAsync( levelAdi );
    // Yeni levelin yuklenmesi tamamlansa bile hemen yeni levela gecis yapma
    instance.loadingIslemi.allowSceneActivation = false;
}
 
function Awake()
{
    // En basta loading ekranini gorunmez yap
    panel.color.a = 0;
    yazi.color.a = 0;
}
 
function Update()
{
    // Yukleme yuzdesini guncelle
    yazi.text = "Yukleniyor %" + ( loadingIslemi.progress * 100 );
     
    // Yukleme tamamlandiysa
    if( loadingIslemi.isDone )
    {
        // Loading ekranini yumusak bir sekilde kaybet (fade out)
        panel.color.a -= animasyonHizi * Time.deltaTime;
        yazi.color.a -= animasyonHizi * Time.deltaTime;
         
        // Loading ekrani tamamen kaybolduysa objeyi deaktif et
        if( panel.color.a <= 0 )
        { 
            gameObject.SetActive( false ); 
        } 
    }
    else // Yukleme islemi bitmediyse 
    { 
        // Loading ekranini yumusak bir sekilde gorunur yap (fade in) 
        panel.color.a += animasyonHizi * Time.deltaTime; 
        yazi.color.a += animasyonHizi * Time.deltaTime; 
        
        // Loading ekrani tamamen gorunur hale geldiyse 
        if( panel.color.a >= 1 )
        {
            // Artik yukleme islemi bitince yeni levela gecebilelim
            loadingIslemi.allowSceneActivation = true;
        }
    }
}

Bu kod biraz uzun durabilir ama aslında anlaması zor olmayan bir kod. Kısaca kodu açıklayacak olursam:

static bir değişken (instance) vasıtasıyla singleton pattern‘den faydalanıyoruz. Loading ekranımızdan oyunda aynı anda sadece bir tane olmalı ve static değişken sayesinde bunu sağlayabiliyoruz.

animasyonHizi adında bir değişkenimiz var. Bu değişkenin değeri 1 olursa loading ekranının belirme süresi 1 saniye olurken değişkenin değeri 2 olursa loading ekranının belirme süresi 0.5 saniye olur. Yani bu değişkenin değeri arttıkça loading ekranının belirme süresi kısalıyor.

loadingIslemi dediğimiz değişken ise oyun sırasında arkaplanda başka bir level yüklememize olanak sağlıyor. Böylece oyuncu mevcut leveli görürken aslında arkaplanda yeni bir level yüklenmekte oluyor.

Scriptimizde LevelYukle adında static bir fonksiyon bulunmakta. Yeni bir level yüklerken kullanmanız gereken fonksiyon bu. Yani artık Application.LoadLevel(“level1”) yazmak yerine LoadingEkrani.LevelYukle(“level1”) yazmalısınız. Bu fonksiyonun içerisinde öncelikle singleton’u sağlıyoruz. Yani eğer sahnemizde bir loading ekranı objesi yoksa yeni bir tane oluşturuyoruz (Instantiate) ve DontDestroyOnLoad komutu ile sahneler arası geçişlerde bu objenin yok olmasının önüne geçiyoruz. Instantiate fonksiyonu içerisinde referans objeyi çekerken Resources.Load fonksiyonunu kullanıyoruz. İşte Resources klasörü burada devreye giriyor. Scriptlerinizden Project klasöründeki bir asset’e erişmek istiyorsanız yapmanız gereken o asset’i Resources klasörü içine atmak. Artık Resources.Load fonksiyonu ile o asset’e erişebilirsiniz. Fonksiyona ikinci parametre olarak ise asset’in türünü (yani bizim örneğimizde GameObject) giriyoruz.

Singleton’u hallettikten sonra Application.LoadLevelAsync fonksiyonu vasıtasıyla yeni levelin arkaplanda yüklenmesi işlemini resmî olarak başlatıyoruz. loadingIslemi değişkeninin allowSceneActivation değişkeniniyse false yapıyoruz. Eğer bu değişken false olursa arkaplandaki levelin yüklenmesi işlemi bitse dahi o levele anında geçiş yapılmaz. Bunu yapıyoruz çünkü diğer levele geçmeden önce loading ekranımızın ekranda tamamen belirmesini istiyoruz. Böylece yeni levela geçince sahne gözümüz önünde küt diye değişmeyecek çünkü loading ekranımız sahneyi kaplayarak bizim bu geçişi görmemizi engelleyecek.

Awake fonksiyonu obje oluşturulduğu anda tek seferlik çalıştırılır. Bu fonksiyonda tek yaptığımız loading ekranını görünmez kılmak. Zira en başta loading ekranı yumuşak bir şekilde yoktan belirecek.

Update fonksiyonu ise yumuşak belirme/kaybolma animasyonlarını kodladığımız yer. Öncelikle sahnenin % kaçının yüklendiğini Durum yazısına iletiyoruz. Sahnenin % kaçının yüklendiğini loadingIslemi‘nin progress değişkeni depolamakta. Bu değişken 0 ile 1 arasında bir değer alır (örneğin 0.76). Bu değeri 100 ile çarparak %’lik hale dönüştürüyoruz (%76 gibi).

loadingIslemi‘nin isDone adında bir değişkeni bulunmakta. Diğer levelin yüklenmesi tamamlandıysa ve loadingIslemi’nin allowSceneActivation’ı true ise bu değişken true değeri alır, yoksa false değeri alır. Eğer diğer levela geçiş yaptıysak (isDone true ise) loading ekranının ekrandan yumuşak bir şekilde kaybolmasını ayarlıyoruz. Bunun için Panel’in ve Text’in Color değişkenlerinin alpha‘sını (görünürlük) azaltıyoruz. Eğer loading ekranı tamamen kaybolduysa objeyi deaktif ederek artık Update’in çalışmasını engelliyoruz.

Eğer isDone false ise, yani diğer level hâlâ yükleniyor ise loading ekranını yumuşak bir şekilde görünür yapıyoruz. Loading ekranı tamamen görünür hale geldiğinde ise allowSceneActivation‘ı true yapıyoruz, böylece yeni levelin yüklenmesi tamamlandığında artık yeni levela güvenli bir şekilde geçiş yapabiliyoruz.

Basit anlamda scriptimiz böyle. Belki çok fazla yeni fonksiyon ve değişken görmüş ve biraz afallamış olabilirsiniz. Ama eminim ki takıldığınız noktaları Google amcaya sorarak çözebilirsiniz. Şimdi isterseniz scripti loading ekranına verelim. Bunun için scripti sürükleyerek sahnemizdeki LoadingEkrani objesine (canvas) verin. Ardından Panel ve Yazi public değişkenlerine Inspector‘dan değerlerini verin:

resim5

Son olarak da bu değişiklikleri prefab’a uygulamak için Inspector‘un tepesindeki Apply butonuna tıklayın. İşte bu kadar! Artık sahnedeki canvas objesini rahatça silebilirsiniz. Geriye sadece sistemi test etmek kalıyor. Bunun içinse tek yapmanız gereken kendi kodlarınızdaki Application.LoadLevel fonksiyonlarını LoadingEkrani.LevelYukle fonksiyonu ile değiştirmek.

Umarım faydalı olur, sonraki derslerde görüşmek dileğiyle!

Yorumlar
  1. terrariablogtr diyor ki:

    Faydali icerik tesekkurler..

  2. Veli diyor ki:

    Benim main menu kodum C#. C# ‘tan jS’e erişemiyorum bunu nasıl çözebilirim.

  3. erdem diyor ki:

    hocam anlatım için teşekkürler ama şu dersleri video şeklinde anlatırsanız daha iyi olacağını düşünüyorum..

  4. Hüseyin Turab Korkmaz diyor ki:

    Erdem seninle aynı fikirdeyim video anlatımlı ders çekebilir misiniz?
    Birde Yardımcı Olabilirseniz Oyunum:
    https://play.google.com/store/apps/details?id=com.SG.MyGame Şimdiden destekleriniz yüzünden teşekkürler.

  5. Suat diyor ki:

    Bende olmadı mavi ekran çıkıyor çalıştırdığımda

  6. Suat diyor ki:

    maalesef olmadı 2 defa tekrar yaptım kodlarda bir problem yok ilk sahneye dediğiniz kodlarıda koydum yine mavi ekran geiyor sahnede birşey yokmuş gibi

    • yasirkula diyor ki:

      Unity’de Play yaptığınız sahnedeki objelerden birinde, Start fonksiyonunda “LoadingEkrani.LevelYukle( Application.loadedLevelName )” olan bir script olduğu halde hiçbir şey olmuyorsa ben de bilmiyorum. Belki yeni bir boş sahne açıp (Sahne2) Start’a LoadingEkrani.LevelYukle( “Sahne2” ); kodunu yazabilirsiniz.

  7. Mehmet diyor ki:

    merhaba iyi günler % 20.546456 gibi yazıyor yuklenirken ondalıklı olarak ben bunu nasıl int’e cevirebilirim ?

  8. Kimex diyor ki:

    scriptin birde c# versiyonu çok güzel olurdu . BU en baştaki #pragma strict ne demek oluyor ?

  9. Kimex diyor ki:

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;

    public class LoadingEkrani : MonoBehaviour
    {

    // LoadingEkrani scriptine kolayca erisebilmek icin static degisken
    private static LoadingEkrani instance2 = null;

    public Image panel;
    public Text yazi;

    // Degeri arttikca yumusak gecis animasyonu hizlanir
    public float animasyonHizi = 1.25f;

    // Level yukleme islemi
    private AsyncOperation loadingIslemi;

    // Yeni bir level yukle
    public static void LevelYukle(string levelAdi)
    {
    // Eger sahnede bir LoadingEkrani yoksa yeni bir tane olustur
    if (instance2 == null)
    {
    instance2 = Instantiate(Resources.Load(“LoadingEkrani”, typeof(GameObject)) as GameObject).GetComponent();
    DontDestroyOnLoad(instance2.gameObject); // Loading ekrani sahneler arasi geciste kaybolmasin
    }

    // Loading ekranini aktiflestir
    instance2.gameObject.SetActive(true);
    // Yeni leveli yuklemeye basla
    instance2.loadingIslemi = SceneManager.LoadSceneAsync(“levelAdi”);
    // Yeni levelin yuklenmesi tamamlansa bile hemen yeni levela gecis yapma
    instance2.loadingIslemi.allowSceneActivation = false;
    }

    void Awake()
    {
    // En basta loading ekranini gorunmez yap
    panel.color = new Color(0, 0, 0, 0);
    yazi.color = new Color(0, 0, 0, 0);
    }

    void Update()
    {
    // Yukleme yuzdesini guncelle
    yazi.text = “Yukleniyor %” + (loadingIslemi.progress * 100);

    // Yukleme tamamlandiysa
    if (loadingIslemi.isDone)
    {
    // Loading ekranini yumusak bir sekilde kaybet (fade out)
    panel.color = new Color(0, 0, 0, -animasyonHizi * Time.deltaTime);
    yazi.color = new Color(0, 0, 0, -animasyonHizi * Time.deltaTime);

    // Loading ekrani tamamen kaybolduysa objeyi deaktif et
    if (panel.color.a = 1)
    {
    // Artik yukleme islemi bitince yeni levela gecebilelim
    loadingIslemi.allowSceneActivation = true;
    }
    }
    }
    }
    Scripti bu hale getirdim C# olarak kullanıyorum ve herhangi bir hata göstermiyor application.LoadLevel kodumuda değiştirdim ama scene değiştirmek için tıkladığımda

    ArgumentException: The thing you want to instantiate is null.
    UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:102)
    UnityEngine.Object.Instantiate[GameObject] (UnityEngine.GameObject original) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:94)
    LoadingEkrani.LevelYukle (System.String levelAdi) (at Assets/Resource/LoadingEkrani.cs:27)
    menuisimleri.Oyna () (at Assets/Script/menuisimleri.cs:40)
    UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:144)
    UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:621)
    UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:756)
    UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53)
    UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35)
    UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44)
    UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52)
    UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269)
    UnityEngine.EventSystems.EventSystem:Update()

    Şeklinde bir hata alıyorum sürekli 😦

    • yasirkula diyor ki:

      Klasörünüzün ismi Resource ise onu Resources olarak değiştirin.

      • Kimex diyor ki:

        Şimdide
        34-) instance2.loadingIslemi = SceneManager.LoadSceneAsync(“levelAdi”);
        36-) instance2.loadingIslemi.allowSceneActivation = false;
        49-) yazi.text = “Yukleniyor %” +loadingIslemi.progress * 100;.
        Satırları için hata veriyor.Sceneleri build bölümüne kayıt ettim neden bu hataları veriyor anlamadım 😦

      • yasirkula diyor ki:

        SceneManager kullanmak için kodun tepesine “using UnityEngine.SceneManagement;” eklemeniz lazım.

        EDIT: Zaten eklemişsiniz. Aldığınız hata mesajında ne yazıyor?

  10. Kimex diyor ki:

    34 için
    Scene ‘levelAdi’ (-1) couldn’t be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.
    To add a scene to the build settings use the menu File->Build Settings…
    UnityEngine.SceneManagement.SceneManager:LoadSceneAsync(String)
    LoadingEkrani:LevelYukle(String) (at Assets/Resources/LoadingEkrani.cs:34)
    menuisimleri:Oyna() (at Assets/Script/menuisimleri.cs:40)
    UnityEngine.EventSystems.EventSystem:Update()

    36 için
    NullReferenceException: Object reference not set to an instance of an object
    LoadingEkrani.LevelYukle (System.String levelAdi) (at Assets/Resources/LoadingEkrani.cs:36)
    menuisimleri.Oyna () (at Assets/Script/menuisimleri.cs:40)
    UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:144)
    UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:621)
    UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:756)
    UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53)
    UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35)
    UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44)
    UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52)
    UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269)
    UnityEngine.EventSystems.EventSystem:Update()

    49 için
    NullReferenceException: Object reference not set to an instance of an object
    LoadingEkrani.Update () (at Assets/Resources/LoadingEkrani.cs:49)

    bunlar yazıyor 😦

    • Kimex diyor ki:

      public void Oyna()
      {
      storeScriptMenu.menudenGeldim = false;
      Reklammenu.AltBannerGizle();
      LoadingEkrani.LevelYukle(“2Oyun”);
      }

      Buda kullandığım yer

      • yasirkula diyor ki:

        Oyununuzdaki sahneleri Build Settings’teki “Scenes In Build” listesine sürükle-bırak yapmanız lazım. Oyun başlayınca açılmasını istediğiniz sahneyi listenin başına koymayı unutmayın.

  11. Kimex diyor ki:

    yukarda yaptığımı yazmıştım ama gözünüzden kaçmış galiba 😦 Zaten kayıt ettiğim halde neden bu hatayı veriyor onu anlamadım 😦

    • yasirkula diyor ki:

      Tamamdır gözümden kaçmış. “instance2.loadingIslemi = SceneManager.LoadSceneAsync(“levelAdi”);” satırını şöyle değiştirmeniz lazım:

      instance2.loadingIslemi = SceneManager.LoadSceneAsync(levelAdi);

      Tırnak işaretlerini sildim çünkü parantezin içinde levelAdi isimli değişkenin değerini kullanıyoruz.

  12. Kimex diyor ki:

    Bir Sonraki Oyun scene nin açılması için butona tıkladığımda
    Hiearch şu hale geliyor

    1Menu
    2Oyun (not loaded)
    DontDestroyOnLoad

    ve bu şekilde kalıyor 😦

    • yasirkula diyor ki:

      Belki Unity 5 ile birşeyler değişmiştir, müsait bir vaktimde kendim de test etmeye çalışırım.

    • yasirkula diyor ki:

      Scripti hiç değiştirmeden 2 basit scene ile Unity 5.3’te test ettiğimde bir hata almadım, sizde neden böyle oluyor çözemedim. Eğer siz çözerseniz burada da paylaşırsanız güzel olur.

  13. Kimex diyor ki:

    O tırnakların kalkması gerektiğini biliyordum ama nasıl farkedemedim hayret 😦 İnternet hızıda çok düşük rahat rahat araştırma yapamıyorum 😦 Bu arada Ankara’daki patlamadada umarım çok fazla zarar yoktur 😦 Herkese geçmiş olsun

  14. Mfa diyor ki:

    Yasir hocam rica etsem. Bu kodun Unity 5 (son sürüme uygun olarak) C# dilinde ki halini de ekleyebilir misiniz acaba? Anlatım tarzınız çok hoş mantığını kavrama konusunda ama java olması benim acımdan kötü malesef 😦 bide yeni sürümde arkadaşın aldığı hatalara baktım da. Lütfen yardımcı olur musunuz? Teşekkürler

    • yasirkula diyor ki:

      O hatalar Scene’i Build Settings’e eklemeyince oluyor.

      using UnityEngine;
      using UnityEngine.UI;
      using UnityEngine.SceneManagement;
      
      public class LoadingEkrani : MonoBehaviour
      {
      	// LoadingEkrani scriptine kolayca erisebilmek icin static degisken
      	private static LoadingEkrani instance = null;
      
      	public Image panel;
      	public Text yazi;
      
      	// Degeri arttikca yumusak gecis animasyonu hizlanir
      	public float animasyonHizi = 1.25f;
      
      	// Level yukleme islemi
      	private AsyncOperation loadingIslemi;
      
      	// Yeni bir level yukle
      	public static void LevelYukle( string levelAdi )
      	{
      		// Eger sahnede bir LoadingEkrani yoksa yeni bir tane olustur
      		if( instance == null )
      		{
      			instance = Instantiate( Resources.Load<GameObject>( "LoadingEkrani" ) ).GetComponent<LoadingEkrani>();
      			DontDestroyOnLoad( instance.gameObject ); // Loading ekrani sahneler arasi geciste kaybolmasin
      		}
      		
      		// Loading ekranini aktiflestir
      		instance.gameObject.SetActive( true );
      		// Yeni leveli yuklemeye basla
      		instance.loadingIslemi = SceneManager.LoadSceneAsync( levelAdi );
      		// Yeni levelin yuklenmesi tamamlansa bile hemen yeni levela gecis yapma
      		instance.loadingIslemi.allowSceneActivation = false;
      	}
      
      	void Awake()
      	{
      		// En basta loading ekranini gorunmez yap
      		Color c = panel.color;
      		c.a = 0f;
      		panel.color = c;
      		
      		c = yazi.color;
      		c.a = 0f;
      		yazi.color = c;
      	}
      
      	void Update()
      	{
      		// Yukleme yuzdesini guncelle
      		yazi.text = "Yukleniyor %" + ( loadingIslemi.progress * 100f );
      		
      		// Yukleme tamamlandiysa
      		if( loadingIslemi.isDone )
      		{
      			// Loading ekranini yumusak bir sekilde kaybet (fade out)
      			Color c = panel.color;
      			c.a -= animasyonHizi * Time.deltaTime;
      			panel.color = c;
      			
      			c = yazi.color;
      			c.a -= animasyonHizi * Time.deltaTime;
      			yazi.color = c;
      			
      			// Loading ekrani tamamen kaybolduysa objeyi deaktif et
      			if( c.a <= 0 )
      			{
      				gameObject.SetActive( false );
      			}
      		}
      		else // Yukleme islemi bitmediyse
      		{
      			// Loading ekranini yumusak bir sekilde gorunur yap (fade in)
      			Color c = panel.color;
      			c.a += animasyonHizi * Time.deltaTime;
      			panel.color = c;
      			
      			c = yazi.color;
      			c.a += animasyonHizi * Time.deltaTime;
      			yazi.color = c;
      			
      			// Loading ekrani tamamen gorunur hale geldiyse
      			if( c.a >= 1 )
      			{
      				// Artik yukleme islemi bitince yeni levela gecebilelim
      				loadingIslemi.allowSceneActivation = true;
      			}
      		}
      	}
      }
      
  15. Merhaba benim sorum var yanıtlarsanız sevinirim. şimdi ben oyun yapıyorum ama unity 4 pro (cracklı) versiyonla. 3 sorum var
    1. Oyunu bitirdikten sonra ücretsiz yayınlayıp ama banka hesabıma bağış isteğinde bulunursam ve oyunu indiren kişiler para verirlerse sorun olur mu?
    2. Oyunu bitirdikten sonra yayınlamadan para toplayıp unity pro lisansını satın aldıktan sonra yayınlamak daha doğrumu olur?
    3. yada Oyunu bitirdikten sonra ücretsiz olarak paylaşırsam sorun olur mu?
    oyunu free sürümünde sata bileceğimi biliyorum ama su(water) ücretsiz versiyonda kötü gözüküyor pro çok gerçekçi ondan yani oyunum survival (hayatta kalma oyunu) olduğu için pro suyuna ihtiyacım var.
    Cevabınıza çok ihtiyacım var yanıtlarsanız çok yardımcı olmuş olursunuz.

    • yasirkula diyor ki:

      Crack’li sürümden para kazanırsanız elbette ki bu riskli bir durum olur. Önemli olan oyunun direkt ücretli olup olmamasından ziyade oyunun “bir şekilde” para kazandırması. Oyun size hiçbir şekilde para kazandırmayacaksa durum nasıl olur bilmiyorum. Para toplayıp Pro almanız doğru bir tercih ancak Pro’nun ücreti tuzlu olduğu için bütçenize dikkat etmeniz lazım.

  16. isa diyor ki:

    çok teşekkürler hocam. ancak bir sorunum var. fade in olayı gerçekleşmeden yani panel tam rengine bürünmeden donuyor. biraz bekliyor ve pat diye %90 oluyor. ardından fade out hiç gerçekleşmeden sahne yükleniyor. Nedeni nedir hocam

    • yasirkula diyor ki:

      Progress’in aniden 90’a zıplaması sık gerçekleşen bir şey maalesef, bazen benim de başıma geliyor. Ancak fade in ve fade out’ların düzgün gerçekleşmemesi garibime gitti. İçi boş 2 basit sahne arasında geçiş yaparken de sıkıntı oluyor mu?

      • isa diyor ki:

        Editörde boş sahnelerde sorun oluyor. Ancak build ettikten sonra fade in düzgün çalışıyor. Ama fade out hiçbir şekilde çalışmıyor. Bu arada yorum kısmına yazdığınız C# kodunu kullanıyorum.

      • yasirkula diyor ki:

        Yorumdaki C# kodunu kullandım ve bende fade-in ve fade-out düzgün çalıştı. Resources klasörü içinde LoadingEkrani isimli prefab’ın olduğundan emin olun. Bir hata alıyorsanız da belki o etkiliyor olabilir.

  17. YUSUF diyor ki:

    Hocam bir türlü yapamdım. Tek sorum olacak. Şimdi bu loading görünümü fln olmadan sadece şu işlem olsun istiyorum. Zaten sadece 2 sceene kullanıyorum biri MainMenu, diğeri Game, şimdi MainMenu de iken alttan Game scenesi yüklensin hazırda beklesin, ben eğer buttonla Game scenesii buttonla çağırınca ise hiç beklemeden direkt Game sceneye gireyim. Acil Lazımda hocam.

    • yasirkula diyor ki:

      LoadingEkrani javascript’inin içerisine şu kodu yazın:

      #pragma strict
      
      import UnityEngine.SceneManagement;
      
      private static var instance : LoadingEkrani = null;
      private var loadingIslemi : AsyncOperation;
        
      public static function GameSceneGecisYap()
      {
          instance.loadingIslemi.allowSceneActivation = true;
      }
      
      function Awake()
      {
      	instance = this;
      }
      
      function Start()
      {
      	loadingIslemi = SceneManager.LoadSceneAsync( "Game" );
          loadingIslemi.allowSceneActivation = false;
      }
      

      Scripti MainMenu’deki aktif bir objeye verin (mesela kamera). Butona basınca ise kendi scriptinizden LoadingEkrani.GameSceneGecisYap(); fonksiyonunu çağırın.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s