‘Oyun Tasarımı’ Kategorisi için Arşiv

Unity LOD Sistemi

Yayınlandı: 17 Ekim 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

Hepinize merhabalar,

Bu derste, Unity‘nin LOD (Level of Detail) sistemini göreceğiz. Bu sistem, yüksek poligonlu bir modelin kameradan uzaklaştıkça daha az poligon ile ekrana çizilmesini sağlayarak oyunun performansını artırır.

Hızlıca derse başlayalım…

(daha&helliip;)

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&helliip;)

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!

Unity Çerez Ders: unitypackage’ları Ayıklamak (Unzip Yapmak)

Yayınlandı: 17 Eylül 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

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!

Unity Çerez Ders: Scene Panelinde UI Objelerini Gizlemek

Yayınlandı: 15 Eylül 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

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!

Unity Çerez Ders: Kameranın Yatay Görüş Alanını Sabitlemek

Yayınlandı: 12 Eylül 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

Merhabalar,

Unity‘de varsayılan olarak kameranın dikey görüş alanı sabittir. Yani mevcut çözünürlükte ekranın alt ve üst kenarlarında hangi objeleri görüyorsanız, diğer tüm çözünürlüklerde de o objeleri aynı yerlerinde görürsünüz. Kameranın dikey görüş alanı sabit olduğu için haliyle yatay görüş alanı çözünürlükle beraber değişir. Mesela bir objeyi ekranın tam sol kenarında kalacak şekilde özene bezene yerleştirirsiniz ama bir bakarsınız ki diğer ekran çözünürlüklerinde obje hiç gözükmüyor ya da ekranın sol kenarından çok uzakta kalıyor.

Bu duruma müdahale edebilmek için, ekranın dikey değil de yatay görüş alanının sabit kalmasını sağlayan script’imi paylaşacağım:

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

Ardından script’i kamera objenize component olarak verip Field of View veya Orthographic Size değerlerini kendinize göre ayarlayabilirsiniz.

Sonraki derste görüşmek üzere!

Unity Çerez Ders: UI’da Gradient Obje Oluşturmak

Yayınlandı: 11 Eylül 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

Tekrar merhabalar,

Unity‘nin UI sisteminde gradient renkli grafikler oluşturmak için (herhangi bir Texture kullanmadan) yazdığım ufak bir script’i paylaşacağım. Ancak 4 köşesi farklı renkli gradient’lerde script her zaman çok iyi sonuç vermiyor bilginiz olsun:

Üstteki animasyonda gif compression’ından dolayı ufak bir grafik hatası var.

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

Ardından Canvas‘ınızdaki içi boş bir GameObject’e Gradient Graphic component’ini eklemeniz yeterli.

Sonraki derslerde görüşmek üzere!