Yine ve yeniden merhabalar,
Bu derste Eclipse ADT kullanarak Unity Android için Java dilinde basit bir plugin yazacağız. Pluginimiz sayesinde ekranda Toast mesajları gösterebileceğiz (Toast dediğimiz şey ekranın altında belirip kısa sürede yok olan bildirim mesajları oluyor):
Eğer programlama konusunda çok yeniyseniz bu ders sizin için olmayabilir. Ama yok ben Android’in tüm nimetlerinden faydalanmak için kendimi tamamen hazır hissediyorum diyorsanız o halde belki bu yazı ile başlangıç yapabilirsiniz.
NOT: Derste yaptığım herşeyi bir unitypackage‘da depoladım. İhtiyaç duyarsanız indirme linki: https://www.dropbox.com/s/are1b4fgra7q1gr/AndroidPluginOrnegi.unitypackage?dl=0
Hazırsanız derse başlayalım!
Öncelikle eğer bilgisayarınızda Eclipse ADT kurulu değilse kurun. Bunun için önce bildiğimiz Eclipse’i kurmalı, ardından şu linkten ADT’yi kurmalısınız: http://developer.android.com/sdk/installing/installing-adt.html
Şimdi plugin dediğimiz şeyin mantığı şöyle işliyor: Eclipse‘te Java kodu yazarak Android’in istediğimiz fonksiyonlarına erişiyoruz. Ardından bu Java kodunu bir jar dosyasına çeviriyoruz ve ardından Unity‘nin bize sağladığı AndroidJavaClass ve AndroidJavaObject class’larından faydalanarak bu plugin ile Unity içerisinden iletişim kuruyoruz. Eğer ki static bir Java fonksiyonu çağırıyorsanız AndroidJavaClass, bir obje üzerinde çalışıyorsanız AndroidJavaObject ideal bir tercih.
Artık pluginimizi yazmaya başlayalım. Eclipse ADT’yi açıyoruz ve File-New-Android Application Project yolunu izliyoruz. Application Name kısmında projemize istediğimiz ismi veriyoruz; ben ToastProject adını verdim. Burada Package Name çok önemli. Ben oranın değerini “com.yasir.toast” (tırnaksız) yaptım ama siz bunu kendinizce değiştirebilirsiniz de. Geri kalan değerleri hiç ellemeden olduğu gibi bırakabilirsiniz:
Geri kalan sayfaları direkt Next’leyin ve Finish diyerek projeyi oluşturun. Şimdi Project Explorer‘dan projenize sağ tıklayın ve Properties seçeneğini seçin:
Gelen pencereden Android sekmesine gidin ve Is Library seçeneğini işaretleyin:
Artık Java kodumuzu yazmaya hazırız. Project Explorer’dan src klasörüne sağ tıklayın ve New-Class yolunu izleyin. Class’a isim olarak ToastTest adını verin. Diğer değerlere dokunmadan Finish’e basarak class’ı oluşturun:
Şimdi class’ın içeriğini şöyle değiştirin:
package com.yasir.toast; import android.content.Context; import android.widget.Toast; import android.app.Activity; public class ToastTest { private static Context context; public static void SetContext( Context c ) { ToastTest.context = c; } public static void ToastGoster( final String mesaj ) { if( context != null ) { ((Activity) context).runOnUiThread( new Runnable() { public void run() { Toast.makeText( context, mesaj, Toast.LENGTH_LONG ).show(); } }); } } }
Gördüğünüz üzere class’ımızda bir static değişken, iki de static fonksiyon bulunmakta. Context dediğimiz şeyin tam olarak ne olduğunu ben de bilmiyorum ancak bazı Android fonksiyonları (Toast gibi) sizden Context türünde parametre girmenizi bekliyor ve Unity oyunlarında bu context’i Unity’den çekmemiz gerekiyor. Bu yüzden SetContext adında bir fonksiyonumuz var: bu fonksiyon sayesinde Unity’den bu ToastTest class’ındaki context değişkeninin değerini belirleyebileceğiz.
İkinci static fonksiyonumuz ise ToastGoster fonksiyonu. Asıl işi bu fonksiyon yapıyor. Orada yazdığım Toast.makeText fonksiyonu Android’e has bir fonksiyon ve bu fonksiyonun bir eşi Unity’nin kendi içerisinde yok. İşte bu yüzden burada plugin yazma ihtiyacı duyuyoruz; aksi taktirde Unity’den ekrana Toast mesajı yazdırmak mümkün değil. ToastGoster içerisinde runOnUiThread ve Runnable gibi “ilginç” icatlarla uğraşıyoruz çünkü arayüzle ilgili bir işlem yapmak için (ekranda Toast mesajı göstermek gibi) böyle bir yol izlememiz gerekiyormuş (ben de bu dersi yazarken öğrendim).
Java ile işimiz burada bitti. Artık Unity’e geçiş yapabiliriz. Unity’de yeni bir proje açın. Ardından Project panelinin içinde bir Plugins klasörü, Plugins klasörü içinde de bir Android klasörü oluşturun. Şimdi Eclipse’e geri dönün ve Package Explorer‘daki bin klasörü içinde yer alan .jar uzantılı dosyayı Unity’deki Android klasörünüze kopyalayın:
Şimdi Unity’de kod yazmaya hazırız. Android klasörünün içinde ToastPlugin adında yeni bir Javascript oluşturalım ve içini şu şekilde değiştirelim:
#pragma strict // Kodun sadece Android'de calismasini, oyunu Unity Editor'de // test ederken calismamasini saglamak icin bir directive // Cunku plugin kodlari editorde calisirken exception verir #if !UNITY_EDITOR && UNITY_ANDROID // Plugindeki ToastTest class'ina erismek icin kullanacagimiz degisken private static var toastClass : AndroidJavaClass = null; // Awake fonksiyonunda tek seferlik initialize islemlerini gerceklestir function Awake() { // Plugindeki ToastTest class'ina erismek icin Unity'de bir degisken olusturuyoruz toastClass = new AndroidJavaClass( "com.yasir.toast.ToastTest" ); // ToastTest class'ina context degerini static bir sekilde (CallStatic) veriyoruz var unityClass : AndroidJavaClass = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ); var unityContext : AndroidJavaObject = unityClass.GetStatic.<AndroidJavaObject>( "currentActivity" ); toastClass.CallStatic( "SetContext", unityContext ); unityClass.Dispose(); } // Ekranda Toast mesaji gostermeye yarayan fonksiyon public static function Toast( gosterilecekMesaj : String ) { // ToastTest class'inin ToastGoster static fonksiyonunu // gosterilecekMesaj parametresi ile cagiriyoruz if( toastClass != null ) toastClass.CallStatic( "ToastGoster", gosterilecekMesaj ); } #endif
Bu fonksiyon oldukça karmaşık gelebilir; normaldir zira çok fazla “korkutucu duran” class ve fonksiyon var. Oysa bu fonksiyonlar gerçekten acayip basit. Şimdi neyin ne olduğunu kısaca anlatmaya çalışacağım.
Elimizde toastClass adında static bir AndroidJavaClass değişkeni var. Pluginimizdeki ToastTest class’ına Unity’den direkt ToastTest diye erişmemiz mümkün değil, araya bir aracı koymak zorundayız. İşte bu aracımız da toastClass değişkeni oluyor. Değişkenin türü AndroidJavaClass çünkü biz direkt olarak ToastTest class’ındaki static fonksiyonlardan faydalanacağız. Yani ToastTest class’ının bir instance’ına (objesine) ihtiyacımız yok. Eğer ki elimizde bir ToastTest instance’ı olsun istiyorduysak o zaman AndroidJavaClass ile değil AndroidJavaObject ile çalışırdık.
Awake fonksiyonumuzda, sadece bir seferlik yapmamızın yeterli olduğu işleri hallediyoruz. Öncelikle toastClass değişkenimize değerini veriyoruz. Bunun için AndroidJavaClass’ın constructor’ına parametre olarak ToastTest class’ına giden yolu giriyoruz. Bu yol da “package ismi.class ismi” şeklinde oluyor. Yani benim durumumda “com.yasir.toast.ToastTest” oluyor. ToastTest’e erişmek için gerekli olan aracıyı (toastClass) oluşturduğumuza göre artık ToastTest’in context değişkenine değerini verebiliriz. Bu context olmadan Toast’u çağırmamız maalesef mümkün değil.
Unity’nin context’ine erişmek için unityClass ve unityContext adında iki değişken oluşturuyoruz. Bu değişkenleri anlamak zorunda değilsiniz, burası biraz ezbere olan birşey (ben de kodu internetten kopyala-yapıştır yaptım yani). Unity’de oluşturduğumuz unityContext değişkenini, pluginimizdeki ToastTest class’ında yer alan static context değişkenine değer olarak atamak için (kısacası plugin ile iletişim kurmak için) ToastTest’e yazdığımız SetContext static fonksiyonunu kullanıyoruz. Plugindeki statik bir fonksiyonu çağırmak için Unity’de kullandığımız fonksiyon ise CallStatic. Parametre olarak plugindeki çağırmak istediğimiz fonksiyonun ismini ve ardından bu fonksiyonun alacağı parametre(ler)i giriyoruz. Bizim durumumuzda bu parametre unityContext oluyor. Son olarak unityClass değişkenini Dispose ile yok ederek memory’de yer işgal etmesini önlüyoruz. toastClass’ı Dispose etmiyoruz çünkü Toast fonksiyonunu çağırırken bu değişkene ihtiyacımız olacak.
Scriptimizdeki ikinci fonksiyon ise Toast fonksiyonu. Parametre olarak ekranda gösterilmesi istenen mesajı alıyoruz. Bu fonksiyonda yaptığımız tek şey toastClass vasıtasıyla pluginimizdeki ToastTest class’ının static ToastGoster fonksiyonunu çağırmak (CallStatic kullanarak).
Kabaca scriptimiz böyle. Anlamadığınız yerler olabilir, normaldir. Bu durumda internette “unity android how to write plugin” araması yaparak bilgilerinizi pekiştirmenizi öneririm.
Artık scriptimizi test edebiliriz. Önce ToastPlugin.js scriptini sahnenizdeki kameraya component olarak ekleyin. Ardından Project panelinde yeni bir Javascript oluşturun:
#pragma strict function Start() { #if !UNITY_EDITOR && UNITY_ANDROID ToastPlugin.Toast( "Merhaba Dunya" ); #endif }
Bu yeni scripti de sahnedeki kameraya component olarak ekleyin. Sonrasında ise Build&Run yaparak oyunu Android cihazınızda çalıştırın. Bir aksilik yoksa oyun açılır açılmaz şöyle bir bildirim göreceksiniz:
Bu dersi de burada bitirmiş oluyorum. Sonraki derslerde görüşmek üzere, hoşçakalın!