Unity native plugin hataları: çağrıdan çok thread sorunu
Unity'de Android ve iOS native plugin yazarken asıl zorluğun çağrıların kendisi değil; thread modeli, build yapılandırması ve release stripping olduğunu anlatan pratik bir rehber. Tek arayüz, editör sahtesi ve ana thread kuyruğu gibi yaklaşımlar ele alınıyor.
Kilit noktalar
- Native API'yi tek bir C# arayüzünün arkasına al ve editör için sahte bir implementasyon ekle.
- Native callback'leri ConcurrentQueue ile ana thread'e taşı; callback içinde doğrudan Unity API çağırma.
- AndroidJavaProxy, UnitySendMessage'a göre derleyici desteği sağladığı için daha güvenli bir callback yoludur.
- iOS frameworkleri ve Info.plist anahtarlarını PostProcessBuild betikleriyle ekle; elle yapılan değişiklikler sonraki build'de kaybolur.
- IL2CPP stripping için link.xml veya keep kuralları tanımla ve release build'i gerçek cihazda test et.
- Pause ve resume davranışını gerçek cihazlarda test et.
Unity'de native plugin yazmak, Java ve Objective-C tarafındaki çağrılar kadar kolay görünür; asıl sorunlar ise genellikle ilk çağrıdan sonra ortaya çıkar. Yazar, native bir callback'in ana thread dışında çalışmasının, release build'de kodun stripping ile silinmesinin ve Android Gradle ve manifest birleştirme adımlarının yarattığı hataları örnek alıyor.
Önerilen yapı şöyle: uygulamanın gördüğü tek bir C# arayüzü, platforma göre seçilen üç implementasyon ve editör için bir sahte sınıf. Native callback'ler thread-safe bir kuyruğa yazılır, bir MonoBehaviour bu kuyruğu Update içinde boşaltır. iOS tarafında frameworkler, Info.plist anahtarları ve string sahipliği post-process betikleriyle yönetilmeli; release build için link.xml ile keep kuralları tanımlanmalı. Yazı, CI'da iki platformun temiz bir ortamda derlenmesini de öneriyor.
Gerçek dünyada kullanımı
- Unity ile yapılmış bir mobil oyunda reklam, paylaşım veya sistem ağ durumu gibi bir platform API'sini kullanmak.
- Vendor SDK'sı yalnızca .aar ve .xcframework olarak sunan bir sağlık veya AR uygulaması.
- Ekibin Unity sürümünü yükselttiği ve native plugin'lerin sessizce bozulup bozulmadığını kontrol ettiği CI hattı.
Neden önemli
Native plugin hataları çoğu zaman çağrının kendisinde değil, thread, build ve release aşamalarında ortaya çıkar. Bu yüzden callback'leri ana thread'e taşımak ve release build'i gerçek cihazda test etmek, Unity projelerinde en çok zaman kazandıran adımlar olur.