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…

Yapmanız gereken, projenizin Editor klasöründe (bu klasör yoksa oluşturun) ConvertTexturesToPNG adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/407e15017a01324a9ea95bf1bdea72f7
Ardından Window-Convert Textures to PNG ile Convert to PNG penceresini açabilirsiniz. Buradaki ayarlar şunlar:
- Root Path: bu klasör içindeki resimler PNG’e çevrilir. Alt klasörlerdeki resimler de çevrilirler
- Textures to Convert: sadece bu uzantılara sahip resimler PNG’e çevrilirler
- Excluded Directories: bu klasör(ler)deki resimlere dokunulmaz. İki klasörün konumunu
;
(noktalı virgül) ile birbirinden ayırabilirsiniz (Textures to Convert‘te olduğu gibi) - Keep Original Files: eğer işaretlenirse, PNG’e çevrilen resimlerin asıllarına dokunulmaz; işaretlenmezse resimlerin asılları otomatik olarak silinirler
- Max Texture Size: bu ebattan büyük resimlerin boyutu bu ebata düşürülür
- OptiPNG Path: hazır bir PNG sıkıştırma kütüphanesi olan OptiPNG ile, PNG’e çevrilen resimlerin boyutunu yaklaşık %20 daha küçültmeye yarar. Bunun için önce optipng.exe dosyasını indirmeli (şuradaki Windows build), ardından bu dosyanın konumunu bu kutucuğa girmelisiniz. İsterseniz bu alanı boş bırakabilirsiniz
- OptiPNG Optimization: sadece OptiPNG Path‘in değeri girilmişse gözükür. Bu değer arttıkça, OptiPNG’nin resim boyutlarını düşürme olasılığı artar ama aynı zamanda resimlerin PNG’e çevrilmesi çok daha uzun sürer
Ayarları doldurduktan sonra, Convert to PNG! butonuna tıklayarak süreci başlatabilirsiniz. Eğer “Keep Original Files” seçeneği kapalıysa veya projenizin Editor Settings‘indeki “Asset Serialization Mode” ayarı “Force Text” ise, PNG’e çevrilen resimlerin kullanıldığı yerler otomatik olarak güncellenir (yani mesela bir materyal Resim.tiff’i Texture olarak kullanıyorduysa, materyal artık otomatik olarak Resim.png’i Texture olarak kullanır). Aksi taktirde tüm bu referansları siz elle güncellemelisiniz.
BONUS: Projedeki Tek Renkten Oluşan Texture’ları Bulmak
3D model asset’lerinde kullanılan Specular, Metallic veya Emission gibi Texture’lardan bazıları sadece tek bir renkten oluşabilir. Eğer materyalde aynı etkiyi Smoothness gibi bir float değeri değiştirerek de elde edebiliyorsak, bu tamamen boşuna bir performans kaybıdır çünkü ekran kartı o materyale sahip objeleri ekrana çizerken basit bir float’ın değerini okumak yerine, boş yere komple bir Texture’un değerini okumak zorunda kalır. Ama bazen materyaldeki float değerlerle oynasak bile, tek renkli Texture’un verdiği etkiyi elde edemeyebiliriz. Bu durumda ise yakınabileceğimiz başka bir nokta var: 3D modelciler genelde bu tek renkli Texture’ların boyutunu 32×32 gibi ufak boyutlara ayarlamazlar, 1024×1024 gibi kocaman boyutlara ayarlarlar. Texture zaten tek bir renkten oluştuğu için, 32×32 de olsa 1024×1024 de olsa birebir aynı etkiyi gösterecek olmasına rağmen o Texture’u yapan 3D artistin ihmalinden dolayı Texture boş yere 0.5 MB fazla yer kaplar ve bu fazlalık hem RAM’e hem de build alınan oyunun boyutuna etki eder (build alınan oyun sıkıştırıldığı için ona 0.5 MB’tan daha az etki eder tabi)!
Üstte bahsettiğim durumları tespit etmeye yardımcı olması için basit bir editör script’i yazdım:

Yapmanız gereken, projenizin Editor klasöründe (bu klasör yoksa oluşturun) SingleColorTextureDetector adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/19905788e68d4c2bbb8e229b5670480a
Ardından Window-Single Color Texture Detector ile Solid Textures penceresini açıp Refresh butonuna tıklayabilirsiniz. İşlem tamamlanınca, projenizdeki tek renkten oluşan tüm Texture’lar listelenecek. Listelenen konumlardan birine çift tıklarsanız, o konumdaki Texture otomatik olarak seçilir.
Listedeki bir Texture’un nerelerde kullanıldığını bulmak için, şu dersimde paylaştığım Asset Usage Detector plugin’ini kullanabilirsiniz. Eğer ilgili Texture’un ebatları 32×32’den büyükse ve Texture’un büyük olmasını gerektirecek çok ama çok özel bir durum yoksa, ilk iş o Texture’un Max Size‘ını 32’e düşürün. Böylece o Texture’un hem RAM hem de build boyutunu optimize etmiş olacaksınız. Ardından Texture’un kullanıldığı materyallerde gerçekten gerekli olup olmadığına bakın. Eğer Texture’u materyalden kaldırınca hiçbir şey değişmiyorsa ne iyi ne âlâ, yaptığınız değişikliği kaydedin. Eğer Texture kalkınca materyalin görünümü değişiyorsa, materyaldeki float değerleri değiştirerek aynı etkiyi alabiliyor musunuz kontrol edin. Alabiliyorsanız o şekilde yaptığınız değişiklikleri kaydedin, aksi taktirde Texture’u materyale geri verin.
Bu dersi de noktaladık. Sonraki derslerde görüşmek üzere!
Hocam merhabalar admob ile ilgili şöyle bir sorunum var. Oyunda bildiğiniz gibi Start a reklam isteği atmak için kodları yazıyoruz. Ben oyunumda kullanıcı yandığı zaman yani oyunu baştan başlatacağım zaman sahneyi baştan yüklüyorum bu da start kısmına yazdığımız kodu tekrar çalıştırıyor ve tekrar reklam isteği atıyor, yani kullanıcı 10 kere yeniden başlayıp 1 kere reklamı görüntüledi ise boşu boşuna 9 tane daha reklam isteği gitmiş oluyor ve istekler boş kalıyor bu da Google açısından sorun yaratıyor. Bunu çözmek için Dontdestroyonload komutunu kullandım bu reklam objesini sahne değişimlerinden koruyor fakat bu sefer de sahneyi tekrar yüklediği zaman sanırım önbellekten önceden yüklediği reklamı siliyor bu yüzden de göstermek istediğimde göstermiyor tekrar reklamı isteği atmam gerekiyor bu sefer de yine en baştaki soruna çıkıyor bunu nasıl çözebilirim?
DontDestroyOnLoad yapacaksanız, Start fonksiyonunda reklam script’inin instance’ı zaten var mı diye bakıp varsa Destroy ile mevcut objeyi yok etmeniz lazım. Yoksa her sahne yeniden başladığında sahnedeki reklam script’i sayısı da 1 artar. Singleton reklam script’imde bu sıkıntı olmamalı.
dediğiniz şeyi anladım öncelikle objeyi bu obje mi diye kontrol edip sonradan oluşan objeleri yok ediyoruz kısaca Singleton kullanıyoruz onda sorun yok fakat dediğim gibi sahne yeniden yüklendiği zaman yüklenen reklamlar önbellekten muhtemelen siliniyor çünkü reklamlar açılmıyor bunu çözemedim tekrar tekrar istek atıp reklamı yüklersem sorun yok fakat dediğim gibi bu sağlıklı bir yol değil.
https://hizliresim.com/nfg24Z admin bu hatayı alıyorum bazı kullanıcılarımdan bende böyle bir hata yok ama nasıl çözebilirim minifity den r8 debug release yi açtım ondan olabilir mi
Bana sormadan önce google araması yapmanı öneririm. ‘your hardware does not support this application failed to load libmain.so unity’ şeklinde arama yapınca karşıma gelen şu linke göre, Unity’nin son sürümlerinde bu sorun düzeltilmiş.
https://developer.android.com/studio/build/shrink-code#native-crash-support bunu nereye koysam kabul etmedi hangi gradle.builde koyucağımı anlamadım gradle.properties e koydum olmadı yardım eder misin
Ben build’leri hep Unity’de alıyorum, Android Studio’da almıyorum. O yüzden Android Studio’da build adımları nasıl oluyor veya Gradle ayarları nereden nasıl yapılıyor bilmiyorum.
tmm admin sağol yine de
admin benim oyunda skor attığında müziğin hızlanmasını istiyorum bunu yapmanın yolu var mı
AudioSource’un pitch değişkenini artırarak sesi hızlandırabilirsin.
sa admin bir konuda yardımın gerek oyunumda internetin açık olup olmadığını kontrol ettirmek istiyorum diyelim butona basınca internet veya mobil veri açıksa reklam girsin değilse direk geçsin
Bunun için ücretsiz bir yöntem var mı bilmiyorum, varsa “unity3d check internet connection github” şeklinde arama yaparak bulabilirsin.
oyunuma reklam ekledigimden beri kasma başladı bunun nedenini nasıl bulabilirim 2. reklam verilmiyor henüz hesap doğrulanmadı diye bundan dolayı olabilir mi nasıl bulabilirim sorunu
https://yasirkula.com/2020/03/26/unity-profiler-kullanimi/
admin bi sorun var ben butona basıyorum geçiş reklamı 3-4 saniye sonra geliyor banner de 3sn sonra geliyor bunu nedenini nasıl bulabilirim ve nasıl çözebilirim
Nedenini nasıl bulabilirsin bilmiyorum ama reklamları oyunun başında yüklemiyorsan, butona basınca yüklüyorsan, reklamı internetten indirmesi vakit alıyor olabilir.
indirmeyi başlta yapıp yüklemeyi butona göre yapmayı nasıl sağlıyabilirim
AdMob dersimin “Gelişmiş Özellikler” başlığı altındaki örnek kodlarda öyle yapıyorum.
Sevgili Geliştiriciler, Aslan Oyun Studiosu’nda, Yakın zamanda yapılan bir incelemeden sonra, uygulamanız olan …(…) Uygulamanızın durumu ve sorunun nasıl düzeltileceği hakkında daha fazla bilgi için aşağıya bakın.
Yayın Durumu
Yayın durumu: Reddedildi
Uygulamanız Google Play’e kabul edilmedi. Bu, mevcut uygulamanızın Google Play’deki durumunu etkilemez
İhlal nedenleri
Sürümlere göre uygunluk sorunları
Sürüm (ler) Uygunluk Sorunu
App Bundle: 1 APK GEÇERLİ GİZLİLİK POLİTİKASI GEREKTİRİR
Uygulamanız, kullanıcıların Telefon Numarası bilgilerini, hem Play Developer Console’da belirtilen alanda hem de Play dağıtılmış uygulamasının içinden bir gizlilik politikası yayınlamadan Alipay SDK aracılığıyla yüklüyor.
Uygulama Paketi: 1
APK ÖNEMLİ AÇIKLAMA GEREKTİRİR
Uygulamanızın, önemli ifşa yönergelerini karşılamadan Telefon Numarası bilgilerinin toplanmasını kolaylaştıran Alipay SDK veya kitaplığı kullandığını belirledik. Gerekirse, daha fazla bilgi için SDK sağlayıcılarınıza danışabilir veya lütfen SDK sürümünü 15.5.5 veya üstüne yükseltebilirsiniz.
yardımcı olur musun admin
Gizlilik poliçesi oluşturup orada Alipay SDK’sinin topladığı telefon bilgilerini nasıl kullandığından bahsetmeniz lazım (belki Alipay SDK’sinin kendi gizlilik poliçesine link atmak da işe yarıyordur bilmiyorum). Ardından bu poliçenin linkini hem oyunun Google Play sayfasındaki gizlilik poliçesi (privacy policy) linki kısmına, hem de oyunun içindeki menülerden birine eklemeniz gerekiyor. Akabinde güncelleme atabilirsiniz.
teşekkürler admin bir şey daha sorucam çok soru sordum biliyorum ama alipay sdknin ne veri topladığını nasıl bulabilirim gizlilik politikası ücretsiz site kurarak orda yayinlasam olur mu
Alipay’in kendi privacy policy’sinde bulabilirsin. Kendi gizlilik politikanı ücretsiz siteye koyabilirsin.
admin image veya buton siteye yönelndirme yapsam olur mu politika ve image veya butona site yönlendirme nasıl yapılır
Bence siteye yönlendirme yapabilirsin. Bunun için Application.OpenURL kullanabilirsin.
Merhaba Google Play Geliştiricisi,
Amaç Yeniden Yönlendirme
Uygulamalarınız Intent Redirection’a karşı savunmasız.
Bu sorunu çözmek için bu Google Yardım Merkezi makalesindeki adımları izleyin.
Daha önce karşılaşmadığım bir hata, büyük ihtimalle kullandığınız plugin’lerden birinden kaynaklanıyor. “Unity Intent Redirection” araması yapmanızı öneririm.
admin unity de oyunu imzalayıp export ediyorum sonra android studio da düzenleme yapıyorum build de generate signed builde de aynı şekil imzalıyorum ama bu sürüm imzalanmamış hatası veriyor
Android Studio’da imzalamayı bilmiyorum.
buldum admin gerek kalmadı teşekkürler
sa admin bir şey sorucam butona bastıktan sonra reklam açılıyor reklamı kapattıktan sonra butonun işlevini yerine getirmesini nasıl sağlıyabilirim
Reklamın kapandığı event’te kodunu çalıştırman lazım. Hangi reklam servisini kullanıyorsan “unity blabla ad close event” diye aratman lazım.
admobu kullanıyom OnAdClosed bunu kullanmak istiyorum reklamı kapat tuşuna basınca sahne yüklemesi yapmasını istiyorum
“unity admob onadclosed event”. Örneğin: https://ads-developers.googleblog.com/2016/04/handling-android-ad-events-in-unity.html
sağol admin biraz geç de olsa anladım nerde hata yaptığım başını ağrıttım k.b. hakkını helal et
Estağfurullah, projende başarılar dilerim.
helal et de sorun kalmasın teşekkürler bu arada oyunu google playe yükledim reklamı hallediyorum şimdi
Helal olsun.
aynı reklam kimliğini 2 farklı yerde kullanabilir miyim yoksa 2si içinde ayrı ayrı mı olmalı mesala 1.butona bastığında gelen reklam kimliği ile 2.butona bastığında gelen reklam kimliği aynı olsa sorun olur mu yoksa değiştirmeli miyim
İkisi için ayrı ayrı analitik verileri görmek istiyorsan farklı yapabilirsin yoksa aynı olabilir.
https://hizliresim.com/BMWJGc
sa bu sorunları nasıl düzeltebilirim
Aleykümselam. İlk uyarı önemsiz duruyor. Diğerleri de oyunun çıkışını veya performansını etkilemez ama oyun çökerse, neden çöktüğünü bulmayı kolaylaştırır. Gerekli adımların ney olduğunu bilmiyorum ama “Daha Fazla Bilgi”den herhalde ne yapmanız gerektiğini bulabilirsiniz. İsterseniz gelen sayfaları İngilizce okuyup anahtar kelimeleri “unity” kelimesi ile birlikte google’da da arayabilirsiniz.
Hocam emeğinize sağlık.
Katkı olması için, şöyle bir yöntem de var:
Binlerce resmi png yapma, hepsinde boyut değiştirme, hepsine filtre ekleme vb vb. tüm senaryoları, PhotoShop’ta Action oluşturarak yapmak mümkün. 2-5-10 aşamalı bir işlem bile olsa, 1 defa yapılanları action olarak kaydedip, sonra klasör/alt-klasörlerindeki tüm dosyalara bu action’ı uygulayabiliyoruz.
Bazı Texture’larda alpha kanalının içeriği, RGB kanallarından çok farklı oluyor. Eğer Photoshop bu resimleri PNG’e çevirirken alpha kanalını herhangi bir şekilde bozmuyorsa bence de güzel bir yöntemmiş. “Save for Web” seçilirse oluşan PNG’lerin boyutu da eminim epey optimize olacaktır. Ama eğer Action’lar sadece belli uzantılara sahip resimleri png’e çevirmemize imkan vermiyorsa, yani jpeg gibi diğer uzantıları da png’e çeviriyorsa bu biraz sıkıntı olur.