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:
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.
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.
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.
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:
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.
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.
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.
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.
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.
Unity‘de TextMesh Pro kullanırken hertmpYazisi.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.
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!
Yeni bir yazı yayımlandığında anında e-posta yoluyla haberdar olun!