• Yeniden merhabalar,

    Unity‘de bir dizi veriyi UI‘da göstermek için Scroll View kullanmak idealdir (örneğin oyun içi market veya leaderboard). Ancak göstereceğiniz verinin boyutu arttıkça (örneğin leaderboard’da binlerce satır [entry] göstermek isteyebilirsiniz), Scroll View’ın performansı düşecektir çünkü her bir entry için ayrı bir UI GameObject’i oluşturacaksınız. Bu performans sorununu çözmenin yolu, her bir entry için ayrı bir GameObject oluşturmak yerine, sadece ekranda görünen entry’ler için elimizde bir düzine UI GameObject’i tutup onları tekrar tekrar kullanmaktır. Bunun için, diyelim Scroll View’ı aşağı kaydırdıkça, ekranın üst kenarından dışarı çıkan GameObject’leri ekranın alt kenarına ışınlayıp tekrardan kullanabiliriz. Böylece sadece birkaç GameObject ile binlerce entry’i Scroll View’da gösterebiliriz:

    Hazırsanız derse başlayalım!

    (daha…)
  • Merhabalar,

    Unity‘nin Hierarchy paneline 2019.1 sürümü ile görünürlük (göz) gizmo’su, 2019.3 sürümü ile de tıklanabilirlik (parmak) gizmo’su eklendi:

    Bir objenin solundaki görünürlük gizmo’suna tıklayarak, o objeyi Scene panelinden gizleyebilirsiniz (obje Game panelinde gözükmeye devam eder). Eğer child objeleri olan bir objenin görünürlük gizmo’suna tıklarsanız, child objeler de otomatik olarak Scene panelinden gizlenir. Bunu istemiyorsanız, Alt tuşu basılıyken gizmo’ya tıklayarak sadece tıkladığınız objeyi gizleyebilirsiniz. Görünürlük gizmo’larının işe yaraması için, Scene panelindeki ilgili butonun aktif olması gereklidir:

    Görünürlük gizmo’su, 4 farklı ikon ile gösterilir:

    • Obje gizlenmemiştir ancak child objelerinden bazıları gizlenmiştir
    • Obje gizlenmiştir ancak child objelerinden bazıları gizlenmemiştir
    • Obje ve tüm child objeleri görünür durumdadır, gizlenmemiştir. Bu ikon sadece objenin üzerine fare imlecini getirince gözükür
    • Obje ve tüm child objeleri gizlenmiştir

    Bazen sahnedeki bir objeye odaklanmak için, diğer tüm objeleri gizlemek isteyebilirsiniz. Bunun için o objeyi seçip Shift+H kısayolunu kullanarak Isolation görünümüne geçiş yapabilirsiniz. Tekrar Shift+H kısayolunu kullanarak da bu görünümden çıkabilirsiniz. Isolation görünümündeyken, Hierarchy’deki görünürlük gizmo’larına yaptığınız değişiklikler kaydedilmez, Isolation görünümünden çıktığınızda bu değişiklikler kaybolur.

    Tıklanabilirlik gizmo’sunun kullanımı ise oldukça basit: bazı objelerin Scene panelinde görünür olmasını istiyor ancak tıklayınca seçilmesini istemiyorsanız, o objelerin tıklanabilirlik gizmo’larını kullanabilirsiniz. Görünürlük gizmo’sundaki 4 farklı ikon, tıklanabilirlik gizmo’su için de geçerli.

    Başka derslerde görüşmek üzere!

  • Merhabalar,

    Diyelim ki Unity oyununuza müzik ekleyeceksiniz ve bunun için Asset Store‘dan güzel bir asset satın aldınız. Paketin içinde yüzlerce müzik var; ayıptır söylemesi boyutu da 1.5 GB. Paketten güzel bir müzik seçebilmek için asset’i projenize ekliyorsunuz ve.. e tabi asset o kadar büyük olunca import işleminin bitmesi için 1 saat bekliyorsunuz. Bu süreci optimize etmek için basit bir editör script yazdım. Bu script vasıtasıyla, bir unitypackage‘ın içindeki tüm asset’leri istediğiniz klasöre çıkarabilirsiniz. Verdiğim örnekte, müzik paketini Asset Store’dan indirdikten sonra projenize import etmek yerine, bu editör script’i ile indirilen unitypackage’ın içeriğini projenizin dışında bir klasöre çıkarabilir, oradan istediğiniz müziği beğenebilir ve son olarak da sadece o müziği Unity projenize import edebilirsiniz.

    Yapmanız gereken, projenizin Editor klasöründe (bu klasör yoksa oluşturun) UnitypackageExtractor adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/dfc43134fbfefb820d0adbc5d7c25fb3

    Ardından Window-Unitypackage Extractor ile Unitypackage Extractor penceresini açabilirsiniz. Gelen pencerede “.unitypackage Path“e unitypackage dosyasının konumunu, “Output Path“e de içeriğin hangi klasöre çıkarılacağını girip Extract! butonuna basabilirsiniz.

    İPUCU: Asset Store’dan indirdiğiniz unitypackage’ları Windows 10’da %APPDATA%\Unity\Asset Store-5.x konumunda bulabilirsiniz.

    Başka derslerde görüşmek üzere!

  • Merhabalar,

    Unity‘nin Slider’larında yuvarlak kenarlara sahip bir 9-sliced sprite kullanmayı denediyseniz, slider’ın Value’su çok ufakken bu sprite’ın scale olduğunu ve bu esnada çirkin durduğunu fark etmişsinizdir. Eğer keşke 9-sliced bir sprite’ı Image‘ın Fill moduyla kullanabilsek dediyseniz, yazdığım script işinize yarayacaktır:

    Yapmanız gereken, projenizde SlicedFilledImage adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/391fa12bc173acdf5ac48c466f180708

    Ardından Canvas‘ınızdaki içi boş bir GameObject’e Sliced Filled Image component’ini eklemeniz yeterli. Slider’ın doluluk oranını değiştirmek için, component’in fillAmount değişkenine [0, 1] aralığında bir değer verebilirsiniz.

    Sonraki derste görüşmek üzere!

  • Yeniden merhabalar,

    Unity‘de sahneyi Scene paneli üzerinden düzenlerken, bazen “Screen Space-Overlay” canvas objeleriniz diğer objelerin üzerine gelerek onlara tıklamanızı zorlaştırabilir. Bu sorunu çözmek için basit bir editör script’i yazdım.

    Yapmanız gereken, projenizin Editor klasöründe (bu klasör yoksa oluşturun) UIToggler adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/e4068629a8a97e1bf0dedfc3cc1ed27f

    Artık Scene panelinin sol üstündeki Hide Canvas butonuna tıklayarak, canvas’ları Scene panelinden gizleyebilirsiniz. Aynı butona tekrar basarak canvas’ları geri görünür hale getirebilirsiniz.

    Başka derslerde görüşmek üzere!

  • Merhabalar,

    Unity‘deki coroutine‘lerde yield return new WaitForSeconds(1f); veya yield return new WaitForSecondsRealtime(1f); sıklıkla kullanılan komutlardır. Ancak bu satırlar her çalıştığında yeni bir WaitForSeconds objesi için bellek ayrılır (allocation). Bunun önüne geçmek için, obje havuzu pattern’inden faydalanan basit bir script yazdım.

    Yapmanız gereken, projenizde BetterWaitForSeconds adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/5cd2681d0cfdbf6ed4a369e1664cfb98

    Ardından coroutine’lerinizde yield return BetterWaitForSeconds.Wait(1f); veya yield return BetterWaitForSeconds.WaitRealtime(1f); satırlarını kullanarak, otomatik olarak obje havuzundan faydalanan WaitForSeconds objeleri ile çalışabilirsiniz.

    Diğer derslerde görüşmek üzere!

  • Yeniden merhabalar,

    Unity‘de TextMesh Pro kullanırken her tmpYazisi.text = intDegisken.ToString(); veya tmpYazisi.text = "Skor: " + intDegisken; yaptığınızda yeni bir string için bellek ayrılır (allocation). Bu da RAM’in daha sık dolmasına ve RAM’i boşaltmak için garbage collector‘un daha çok çalışmasına sebep olur (garbage collector’dan Optimizasyon dersimin başında bahsettim). Bu sıkıntıyı çözmek için basit bir script yazdım. Her ne kadar bu script’in performansı üstteki kodlara göre muhtemelen bir tık kötü olsa da, ben performansın olumsuz etkilendiğini henüz görmedim.

    Yapmanız gereken, projenizde TMP_IntegerText adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/31704321d6eef8df19933fe502ae6219

    Artık kodunuzu şu şekilde güncelleyebilirsiniz:

    • tmpYazisi.text = intDegisken.ToString(); yerine tmpYazisi.SetText(intDegisken);
    • tmpYazisi.text = "Skor: " + intDegisken; yerine tmpYazisi.SetText(intDegisken, "Skor: ", null);
    • tmpYazisi.text = "Para: " + intDegisken + "$"; yerine tmpYazisi.SetText(intDegisken, "Para: ", "$");

    Bu script, varsayılan olarak maksimum 64 karakterli string’leri destekler. Daha uzun string’ler için, script’teki readonly char[] arr array’inin boyutunu artırabilirsiniz.

    Oyunu editörde Profiler ile test ederken SetText fonksiyonu GC Alloc yapıyor gözükebilir ama oyunu build alınca bu değer 0’a inecektir.

    Sonraki derslerde görüşmek üzere!

Son Yorumlar