Unity Android Oyunlarınızı Debug Etmek

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

GÜNCELLEME (08.08.2019): 1 yeni metot eklendi.

Hepinize merhabalar,

Unity‘de oyun tasarlarken bol bol Debug.Log kullanır, nerede ne olduğunu veya bir hatanın neyden kaynaklandığını bu şekilde anlamaya çalışırım. Oyunu Android cihazda test ederken de bu log’lara erişebilmek ve(ya) Unity’nin verdiği exception’ları görebilmek oldukça büyük önem arz edebiliyor. Bunun için kullanabileceğimiz 5 farklı yöntem var: Unity 2017+ için Consoleadb logcat, Android Studio, Oyun İçi Debug Konsolu ve Eclipse ADT.

Başlamadan önce tamamlamanız gereken birkaç adım var:

  • cihazınızın Geliştirici Seçenekleri menüsünden USB hata ayıklama‘yı aktifleştirin (eğer geliştirici seçenekleri sizde yoksa internette “Android geliştirici seçeneklerini aktif etme” diye arama yapabilirsiniz)
  • cihazı USB kablo ile bilgisayarınıza bağlayın.
  • Android SDK Manager‘da Google USB Driver‘ın kurulu olduğundan emin olun:

  • eğer hata almadan Build&Run yapabiliyorsanız her şey tamamdır. Aksi taktirde cihazınızın güncel USB sürücüsünü indirip kurmanız gerekebilir

Artık log’larımızı görmeye hazırız! Log’ları görmek için birden çok alternatif yol bulunmakta:

1) Unity 2019 ve Sonrasında Android Logcat Package’ını Kullanmak

Unity’nin geliştirdiği Android Logcat package’ını edinmek için öncelikle Window-Package Manager yolunu izleyin ve gelen listeden “Android Logcat“i seçip sağ alttaki Install butonuna tıklayın. Kurulum tamamlandıktan sonra, Window-Analysis-Android Logcat yolunu izleyerek logcat penceresini açabilirsiniz (oyunu Android’e Build&Run yaptığınızda bu pencere otomatik olarak açılır):

Eğer cihazınız USB ile bilgisayara bağlı olduğu halde log’larını göremiyorsanız, yukarıdaki Auto Run‘ın seçili olduğundan emin olup onun sağındaki yerden cihazınızı seçebilirsiniz (bir cihaz seçili değilken No device yazar). Sadece açık olan bir uygulamanın log’larını görmek için, No Filter‘a tıklayıp uygulamanızı listeden seçebilirsiniz; ancak sonunda [Exited] yazanlar, uygulamanızın kapatılmış eski oturumlarının log’larıdır, yanlışlıkla onları seçmeyin.

Sadece belli tag’e sahip log’ları görmek için (örneğin AdMob’un log’ları Ads tag’ine sahiptir), Tag sütununa sağ tıklayıp Tag Control… seçeneğini seçin:

Gelen penceredeki boş kısma istediğiniz tag’i (mesela Ads) girip ADD butonuna tıklayın. Ardından Tag sütununa tekrar sağ tıklayıp, yeni oluşturduğunuz tag’i seçin. Böylece artık sadece o tag’e sahip log’lar gözükecek. Yine tüm log’ları görmek için No Filter seçeneğini seçebilirsiniz.

2) Unity 2017 ve Sonrasında Konsolu Kullanmak

Bu yöntem vasıtasıyla log’ları direkt Unity’nin konsolunda görmeniz mümkün. Bunun için Build Settings‘ten “Development Build“i işaretleyip cihazınızı USB kablo ile bilgisayarınıza bağlayın ve Build&Run yapın. Ardından Console panelinde Error Pause butonunun sağında yer alan butona tıklayıp AndroidPlayer‘ı seçin:

Ancak sanırım sistem biraz bug’lı çünkü bazen log’ları görmeye başlamak için Player Logging‘i kapatıp tekrar açmam gerekiyor.

Bu yöntem her ne kadar pratik olsa da gözlemlediğim kadarıyla epey dezavantajı da bulunmakta:

  • emülatör desteklemiyor
  • log’lara tıklayınca stacktrace (hangi satırın log/hata verdiği) gözükmüyor
  • Development Build’i işaretlemeniz gerekiyor
  • her log’u göstermiyor (örneğin AdMob log’ları)

3) adb logcat

Yapmanız gereken şey, Android SDK’yı kurduğunuz yerdeki platform-tools klasörüne gitmek (C:\Program Files (x86)\Android\android-sdk\platform-tools). Bu klasörde normal şartlarda adb.exe dosyası olması lazım, yoksa sebebini ben de bilmiyorum. Şimdi klavyeden Shift tuşuna basılı tutarken ve hiçbir dosya seçili değilken klasörde boş bir yere sağ tıklayın ve “Komut penceresini burada aç” seçeneğini seçin (Windows 10’da PowerShell penceresini buradan açın):

resim2

Gelen komut penceresine “adb logcat -s Unity” (tırnaksız) yazın. Artık Unity oyununuzu cihazınızda çalıştırdığınızda oyuna dair tüm log’lar burada gözükecek:

resim3

Logcat’i durdurmak için CTRL+C yapabilirsiniz. Burada bilmeniz gereken bir nokta şu ki; adb logcat komutunu çalıştırdığınızda belki 10-20 dakika önce alınmış log’ları da görürsünüz çünkü bu log’lar hemen temizlenmez ve bir süre cihazda tutulurlar. Kafa karışıklığını önlemek amaçlı, cihazdaki log’ları tamamen temizlemek isterseniz konsola “adb logcat -c” yazabilirsiniz.

NOT: AdMob log’larını görmek için “adb logcat -s Ads” yazın. Cihaza gelen tüm log’ları (Unity ile alakalı veya değil) görmek için de sadece “adb logcat” yazın.

4) Android Studio

Android Studio’yu açın ve View-Tool Windows-Logcat yolunu izleyin. Şu anda cihaza gelen tüm log’ları Logcat penceresinde göreceksiniz. Sadece Unity ile alakalı log’ları görmek için Logcat penceresinin en sağ üstündeki butona tıklayın ve “Edit Filter Configuration” yolunu izleyin:

Artık sadece Unity’nin log’larını göreceksiniz. Ancak diyelim ki sadece AdMob’un log’larını görmek istiyorsanız o zaman “Log Tag” olarak Ads girin.

5) Oyun İçi Debug Konsolu

Bu plugin ile herhangi bir araç kullanmadan direkt oyun içerisinden log’ları görmeniz mümkün. Detaylar için sizi şuraya alayım: https://yasirkula.com/2016/06/18/unity-oyun-ici-debug-konsolu-ui-sistemi-ile/

6) Eclipse ADT

ADT dediğimiz şey, henüz Android Studio yokken Android’e uygulama yazmak için kullanılan bir Eclipse plugin’i idi. Her ne kadar artık ADT çok kullanılmıyor olsa da bu seçenekten de bahsetmeden geçmeyelim.

Eclipse ADT plugin’ini bir şekilde (google) kurup açtıktan sonra menü barından “Window-Show View-Other…” yolunu izleyin ve gelen listeden LogCat‘i seçin:

resim4

Kullanıcı arayüzüne LogCat adında yeni bir panel gelecek. Bu LogCat panelinde “Saved Filters” diye ufak bir bölme var. Orada ilk başta sadece “All messages (no filters)” yer almakta. Bu filter seçili iken Android cihazınızın verdiği tüm log’lar LogCat panelinde listelenir. Sadece Unity’nin verdiği log’ları görmek için yapmamız gereken şey “Saved Filters“a yeni bir filtre eklemek:

resim5

Artık Unity oyununuzu çalıştırdığınız vakit LogCat panelinde Unity’nin verdiği log’ları ve exception’ları görebilirsiniz:

resim6

İşte bu kadar! Sonraki derste görüşmek üzere!

yorum
  1. rustem dedi ki:

    YA üstad sen Kralsın Valla bak emeğine sağlık. Forumlarda hep senin adın geçiyor unity hakkında ellerine sağlık

  2. ibrahim altun dedi ki:

    hocam iyigunler build run yapınca hata aldım güncel usb surucusunu nasıl kurabilirim hatalarım:

    Error building Player: UnityException: Couldn’t find Android device
    No Android devices found. If you are sure that device is attached then it might be USB driver problem, for details please check Android SDK Setup section in Unity manual.

    • yasirkula dedi ki:

      Eğer Android SDK’nızda Google USB Driver kurulu değilse kurun. Aksi taktirde, telefonu USB ile bilgisayara bağladıktan sonra, telefon farklı USB modları seçmenize izin veriyorsa (“Medya aygıtı olarak bağlan”, “Şarj et”, “Depolama aygıtı olarak bağlan” vb.) değişik USB modları ile bağlanmayı deneyin. En kötü ihtimalle, google’a telefonunuzun modelini ve “usb driver” yazıp gelen sonuçları inceleyin.

  3. Baki dedi ki:

    Yasir uygulamada test reklamlarının gösterilip uygulama ID reklamlarının gösterilmemesi normal mi? Yani artık reklamlar uygulamamız mağazalarda yayınlandıktan sonra mı gösteriliyor?
    ( Unutmadan, verdiğin bilgiler için teşekkür ederim.. )

    • yasirkula dedi ki:

      Normal değil, test modunu kapattıysanız/test modu ile alakalı kodları sildiyseniz artık normal reklamlar görmeniz lazım.

      • Baki dedi ki:

        Test kodlarını yorum satırına aldım ama değişiklik yok. Araştırmaya devam teşekkürler tekrardan. Bu arada Android Studio logcat çıktısı ise –>
        05-11 17:19:27.188 2025-31265/? W/Ads: App does not have the required permissions to get location
        05-11 17:19:27.248 2025-32201/? I/Ads: SDK version: falanfilan
        05-11 17:19:27.498 32033-32033/? I/Ads: Ad failed to load : 3
        05-11 17:19:27.498 32033-32033/? D/AdsUnity: Calling destroy() on Android
        05-11 17:19:36.448 32033-32033/? D/AdsUnity: Calling loadAd() on Android
        05-11 17:19:36.458 32033-32033/? I/Ads: Use AdRequest.Builder.addTestDevice(“falanfilan”) to get test ads on this device.
        05-11 17:19:36.488 32033-32033/? D/AdsUnity: Calling hide() on Android
        05-11 17:19:36.488 32033-32033/? D/AdsUnity: Calling show() on Android
        05-11 17:19:36.548 2025-32194/? W/Ads: App does not have the required permissions to get location
        05-11 17:19:36.618 2025-32201/? I/Ads: SDK version: falanfilan
        05-11 17:19:36.878 32033-32033/? I/Ads: Ad failed to load : 3
        05-11 17:19:36.878 32033-32033/? D/AdsUnity: Calling destroy() on Android

      • yasirkula dedi ki:

        “Ad failed to load : 3” satırları, sunucuda reklam olmadığını söylüyor. Yani kodunuz doğru ama sadece sunucuda sunulabilecek bir reklam bulunmuyor gibi duruyor. Özellikle rewarded reklamlar konusunda Türkiye’den çok reklam veren firma yok gibi duruyor çünkü Admob’un rewarded reklam havuzu burada maalesef hep kısıtlı.

      • Baki dedi ki:

        Evet evet, ama uygulamamda sadece banner ve interstitial var. Belki de önlem amaçlı uygulamayı hedeflediğimiz platforma linklememiz gerekiyordur artık. Bilemedim de bulamadım da. Teşekkürler desteğin ve yorumun için.

ibrahim altun için bir cevap yazın Cevabı iptal et

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.