Merhabalar,

Bu derste, Unity oyunlarınıza nasıl dinamik UI panelleri ekleyebileceğinizi göstereceğim. Bu paneller, tıpkı editördeki paneller gibi, hareket ettirilebiliyor, yeniden boyutlandırılabiliyor ve diğer panellerin yanına sekme olarak atanabiliyor.

Asset Store: https://assetstore.unity.com/packages/tools/gui/dynamic-panels-114126

Alternatif link: https://github.com/yasirkula/UnityDynamicPanels/releases

WebGL demo: http://yasirkula.net/DynamicPanelsDemo/

Bu asset’i, Oyun İçi Debug Konsolu‘nu ve Oyun İçi Inspector‘u kullanarak oluşturduğum sahneden bir resmi aşağıda görebilirsiniz:

Detaylar için yazının devamını okuyabilirsiniz…

Öncelikle indirdiğiniz unitypackage‘ı Assets-Import Package yoluyla projenize import edin. Ardından UI paneller hangi objenin child’ı olsun istiyorsanız, o objeye Dynamic Panels Canvas component’i verin. Dilerseniz bu component’i direkt sahnenizdeki Canvas‘a da verebilirsiniz. Burada bilmeniz gereken bir nokta, Dynamic Panels Canvas component’ini hangi objeye verirseniz, panellerin hareket alanı o objenin RectTransform‘unun kapladığı alanla sınırlı olur. Yani eğer canvas’a verirseniz paneller canvas’ın tamamını kullanabilirken, canvas’ın sadece sol yarısını kaplayan bir RectTransform’a verirseniz paneller canvas’ın sağ yarısına dokunmazlar.

Editörden de aşina olabileceğiniz üzere, iki çeşit panel vardır: kenetlenmiş (docked) panel ve serbest panel. Bir paneli sekmesinden tutup diğer panellerin kenarlarına veya ekranın bir kenarına bırakınca, paneli oraya kenetlemek mümkündür. Bu şekilde kenetlenmiş paneller birlikte hareket ederler. Veya kenetlenmiş bir paneli sekmesinden tutup boş bir yere sürükleyince, o paneli serbest hale getirmek mümkündür. Bu durumda o panel, diğer panellerden bağımsız bir şekilde serbestçe hareket edebilir. Bu davranışlar oyun içi paneller için de geçerlidir.

Şimdi panelleri oluşturmaya başlayabiliriz. Bu sistemde paneller, oyun esnasında dinamik olarak oluşurlar. Bizim sadece Dynamic Panels Canvas component’inin Inspector‘undan, hangi UI objelerinin panele dönüşmesini istediğimizi söylememiz yeterli:

Burada 3 ana bölme karşımıza çıkıyor:

A) Properties

Minimum Free Space: Dynamic Panels Canvas’ın içerisinde daime panellerin kapatamayacağı bir boşluk vardır. Bu değer, boşluğun minimum boyutunu belirler. Bu kadar az boşluk kaldığında artık paneller bu boşluğu dolduracak şekilde yeniden boyutlanamazlar.

Panel Resizable Area Length: Panelleri yeniden boyutlandırmaya yarayan görünmez alanın boyutunu belirler. Bu alan ne kadar büyük olursa panelleri yeniden boyutlandırmak o kadar rahat olur.

Canvas Anchor Zone Length: Bir paneli sekmesinden tutup sürükleyerek Dynamic Panels Canvas’ın bir kenarına yaklaştırınca, paneli canvas’ın o kenarına kenetlemek (dock) mümkündür. Bu değer, paneli canvas’a ne kadar yaklaştırınca ona kenetlenebileceğimizi belirler.

Panel Anchor Zone Length: Bir paneli sekmesinden tutup sürükleyerek başka bir panelin bir kenarına yaklaştırınca, paneli o diğer panele kenetlemek mümkündür (eğer diğer panel halihazırda kenetli bir panel ise). Bu değer, paneli diğer panelin kenarına ne kadar yaklaştırınca ona kenetlenebileceğimizi belirler.

B) Free Panels

Oyunun başında serbest olmasını istediğiniz panelleri burada belirleyebilirsiniz. Add New butonuna basarak yeni bir serbest panel oluşturup ardından + butonuna tıklayarak bu panele sekmeler ekleyebilirsiniz. Her bir sekmenin 4 parametresi vardır:

Content: O sekme aktifken, panelin içerisinde hangi RectTransform‘un gösterileceğini belirler. Panel olmasını istediğiniz RectTransform’u buraya vermelisiniz.

Label/Icon: Sekmenin ismini ve (tercihen) ikonunu belirlemeye yarar.

Min Size (XY): Content‘in minimum boyutunu belirlemeye yarar. Paneli yeniden boyutlandırırken bu boyutun altına inilemez.

Mevcut bir serbest paneli silmek için, o panelin bir sekmesini seçin ve Remove Selected butonuna tıklayın.

C) Docked Panels

Oyunun başında kenetli olmasını istediğiniz panelleri burada belirleyebilirsiniz. “= Docked Panels =” başlığının altındaki büyük önizleme alanında yer alan bir bölmeye tıklayıp Dock new panel inside butonlarını kullanarak o bölmeye yeni bir panel kenetleyebilirsiniz. Ardından o panele sekmelerini vermeyi unutmayın. Dilerseniz Dock new panel to canvas butonlarını kullanarak direkt canvas’ın kenarlarına kenetli paneller de oluşturabilirsiniz.

Eğer bir noktada takılırsanız Plugins/DynamicPanels/DemoScene sahnesini açıp oradan kopya çekebilirsiniz. Şimdiye kadar demeyi unuttum ama demo sahnesinde de göreceğiniz üzere, dilerseniz aynı sahnede birden çok Dynamic Panels Canvas component’i bulundurabilirsiniz. Sürükle-bırak ile de panellere bu canvas’lar arasında geçiş yaptırabilirsiniz.

Bu dersin burada sonuna gelmiş bulunmaktayız. Sonraki dersimizde görüşmek üzere!

yasirkula için bir cevap yazın Cevabı iptal et


12 yanıt

  1. crll Avatar
    crll

    Selamun aleyküm hocam. Müsadenizle bir şey soracaktım size. Ben Unity ‘de Play Mode ‘a geçerken Unity donup kalıyor. Ne yapabilirim sizce?

    1. yasirkula Avatar

      Aleykümselam. “unity enter play mode taking too long” şeklinde arama yapmanız lazım.

      1. crll Avatar
        crll

        tamamdır hocam teşekkürler.

  2. sizik Avatar
    sizik

    Selamun Aleyküm hocam. Unity ‘den build alamıyorum. Önccelikle;
    1 – Telefonumun bağlı olması gerekiyor mu pc’ye? Çünkü her denememde pc ‘ye telefonu takmadığım için hata veriyor.
    2 – Telefonu bağladığımda ise başka hatalar veriyor. Hatalar şu şekilde;

    Exception: Failed running C:\Program Files\Unity\Hub\Editor\2020.3.12f1\Editor\Data\il2cpp/build/BeeSettings/offline/bee.exe –useprebuiltbuildprogram –no-colors

    stdout:
    [ ] Require frontend run. tundra.dag no longer valid. FileSignature timestamp changed: il2cpp_settings.json
    [ 0s] Executed build program. Created build graph with 2 nodes.
    [ 0s] Freezing tundra.dag.json into .dag (.dag file didn’t exist)
    [0/2 0s] Il2Cpp C:/Users/carel/Desktop/Unity/İlkOyun/Library/Il2cppBuildCache/Android/armeabi-v7a/Native/armeabi-v7a/libil2cpp.so
    ##### CommandLine

    ##### ExitCode
    1
    ##### Output
    Failed to create output directory for targetfile C:\Users\carel\Desktop\Unity\İlkOyun\Library\Il2cppBuildCache\Android\armeabi-v7a\Native\armeabi-v7a\libil2cpp.so as part of preparing to actually running this node
    *** Bee build failed (0.05 seconds), 0 items updated, 2 evaluated
    stderr:

    1. yasirkula Avatar

      Mesajlarınız spam’e düşmüş, bazen maalesef öyle oluyor.

      1- Build&Run yapıyorsanız telefon bağlı olmalı, sadece Build yaparken gerekmiyor.
      2- Büyük olasılıkla, klasör isminizin İlkOyun olmasından kaynaklı. Klasör isminde hiç Türkçe karakter (İ) kullanmamayı deneyin.

      1. sizik Avatar
        sizik

        Ya hocam valla Allah razı olsun 1 gün boyunca uğraştım. Sorun sizin de yardımınızla elhamdülillah çözüldü. 😀

  3. Bayram Avatar
    Bayram

    Hocam konuyla biraz alakasız ama kendim yapamadım bir türlü o yüzden sizden yardım almak istedim. Hocam oyunun ana menüsündeki play tuşuna basınca oyunu oynayan kişi kaçıncı levelde kaldıysa ordan devam edebilmesini nasıl yapabilirim?

    1. yasirkula Avatar

      Öncelikle yeni bir levela geçince şu kod ile o levelı kaydedin:

      PlayerPrefs.SetInt(“KayitliLevel”, oyuncununKaldigiLevelinNumarasi);
      PlayerPrefs.Save();

      Play tuşuna basınca, şu kod ile kaçıncı levelda kaldığını bulup o levelı başlatabilirsiniz:

      int oyuncununKaldigiLevelinNumarasi = PlayerPrefs.GetInt(“KayitliLevel”, 0); // Eğer henüz kayıtlı level yoksa (mesela oyun ilk defa açıldıysa) 0 döndürür

      1. Bayram Avatar
        Bayram

        hocam level geçince olacaklar ve play butonu kodları ayrı scripteler

      2. yasirkula Avatar

        Dediğim kodları, kodların çalışmasını söylediğim yerlerde kullanınca sorun olmamalı.

      3. Bayram Avatar
        Bayram

        hocam olmuyor bu verdiğiniz kodda

        PlayerPrefs.SetInt(“KayitliLevel”, oyuncununKaldigiLevelinNumarasi);
        PlayerPrefs.Save(); (burasını hata veriyor tanımlı bağlam yok diye)

        unity de aynı şeklide burayı hata olarak görüyor

      4. yasirkula Avatar

        oyuncununKaldigiLevelinNumarasi kısmını, oyuncunun kaldığı level’in numarasını tutan bir değişken ile değiştirmeniz lazım. Diyelim oyuncu 3. leveldan 4. levela geçiş yapıyorsa, bu değişkeninizin değeri 4 olmalı (oyunu geri yüklerken 4. değil de 5. level’dan başlıyorsa, değeri 4-1=3 olmalı).