‘UNITY 3D’ Kategorisi için Arşiv

Yeniden merhabalar,

Asset Store’dan projenize import ettiğiniz veya ekibinizdeki grafikerlerden aldığınız Texture’ların bazen tek bir tanesinin bile onlarca MB (ender durumlarda yüzlerce MB) yer kapladığına şahit olabilirsiniz. Bu durum genelde resmin sıkıştırılmamış TIFF veya TGA gibi bir formatta olmasından kaynaklanır. Bu resimleri PNG‘e çevirerek, kalitede hiçbir bozulma olmadan bu dosyaların boyutlarını ciddi miktarlarda düşürebilirsiniz. Örneğin ben Asset Store’dan import ettiğim bir 3D asset’in bu tarz Texture’larını PNG’e çevirerek, projenin boyutunu 1.08 GB’dan 510 MB’a kadar düşürdüm. Yanlış anlaşılma olmasın: Texture’ların sadece Unity projesinde kapladığı alan düşüyor, build alınan oyunun boyutu değişmiyor. Ama bu bile, projenin harddiskinizde daha az yer kaplaması veya projenin daha kolay yedeklenebilmesi gibi konularda yardımcı oluyor.

Bu iş için yazdığım editör script’ini görmek için yazının devamını okuyabilirsiniz…

(daha&helliip;)

Unity Çerez Ders: Projenizdeki Klon (Duplicate) Asset’leri Bulmak

Yayınlandı: 21 Aralık 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

Merhabalar,

Bir Unity projesinde birden çok kişi çalışıyorsanız, aynı asset’in projeye birden çok kez eklendiğine şahit olabilirsiniz. Bu da projenin boyutunun gereksiz yere büyümesine sebep olabilir. Projedeki hangi asset’lerin birbirinin klonu olduğunu bulabilmek için, basit bir editör script’i yazdım:

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

Ardından Window-Duplicate Asset Detector ile Duplicate Assets penceresini açıp Refresh butonuna tıklayabilirsiniz. Burada dikkat etmeniz gereken 3 nokta var:

  • Hangi asset’lerin birbirinin klonu olduğunu bulabilmek için, script her asset’in hash’ini çıkarıp bu hash’leri birbiri ile kıyaslıyor. Çok ender de olsa, farklı asset’lerde hash çakışması olabilir ve klon olmayan asset’ler klon gibi listelenebilir. İlaveten, script sadece hash’lere baktığı için, asset’lerin import ayarlarına bakmıyor. Bu duplicate asset’lerin import ayarlarını siz kendiniz kontrol etmeli ve hangi duplicate asset’lerin gereksiz olduğuna ona göre karar vermelisiniz.
  • Listelenen konumlardan birine çift tıklarsanız, o konumdaki asset otomatik olarak seçilir.
  • Duplicate asset’lerin önizlemelerinden birine tıklarsanız, o duplicate asset’lerin hepsi otomatik olarak seçilir.

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

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!