Unity 3D Android Oyunlarınıza AdMob Reklamları Eklemek – Resimli Anlatım

Yayınlandı: 26 Mayıs 2014 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

GÜNCELLEME – 09.09.2019: Reklam gözükmemesi sebeplerine Gradle için bir madde eklendi.

Hepinize merhaba,

Bana gerek Facebook’tan gerek başka platformlardan, Unity‘de yapılan Android oyunlarına nasıl reklam eklenebileceği ile ilgili çok fazla soru geliyordu. Ama kendi oyunlarıma hiç reklam eklemediğimden ben de bilmiyordum. Hem kendim bu işin nasıl yapıldığını öğrenmek hem de size göstermek için bu yazıyı yazıyorum.

Derste AdMob reklamlarını kullanacağız (dersin devamında Unity Ads için mediation talimatları da mevcut). Eğer henüz Android SDK‘yı kurmadıysanız, sizi önce şuraya alayım: https://yasirkula.com/2013/07/17/unity-android-sdk-kurulumu-resimli-anlatim/

Yazıyı yazarken faydalandığım kaynak: https://developers.google.com/admob/unity/start

İlk yapmanız gereken, şu adresten GoogleMobileAds.unitypackage‘ı indirmek: https://github.com/googleads/googleads-mobile-plugins/releases/latest

Ardından AdMob web sitesinden yeni bir hesap oluşturun (Sign up)(Gmail hesabı gerekli) veya mevcut hesabınızla sisteme giriş yapın (Sign in): https://admob.google.com/home/

Hesabınızı oluşturduktan ve sisteme giriş yaptıktan sonra, solda yer alan menüden Uygulamalar-UYGULAMA EKLE yolunu izleyip hesabınıza yeni bir uygulama ekleyin. Yeni oluşturduğunuz uygulamaya reklam eklemek için, sol menüden Uygulamalar-uygulama_ismi‘ni seçin ve yine sol menüde yer alan Reklam birimleri‘ne tıklayın. Son olarak da, gelen ekrandan REKLAM BİRİMİ EKLEYİN butonuna tıklayın.

a) Banner Reklamlar

Reklam türü olarak Banner seçin ve bir Reklam birimi adı girin (mesela İlk Banner Reklamım). REKLAM BİRİMİ OLUŞTUR butonuna tıklayarak işlemi sonlandırın.

b) Interstitial (Geçiş)(Tam ekran) Reklamlar

Yine banner reklamda olduğu gibi, özgün bir Reklam birimi adı girip reklam biriminizi oluşturun.

c) Rewarded (Ödüllü) Video Reklamlar

Bu video reklam türünde, kullanıcı reklamı baştan sona izlediği taktirde kullanıcıyı oyun içerisinde bir şekilde ödüllendirmeniz gerekir (örneğin 100 altın vererek). Bu durumda Ödül ayarları‘ndan Ödül miktarı olarak 100, Ödül öğesi olarak da altın girebilirsiniz. Burada belirlediğiniz değerler Unity kodunuza parametre olarak gittiği için, burası vasıtasıyla kullanıcıların reklam izleyerek kazandığı altın sayısını dinamik olarak değiştirebilirsiniz (Unity kodunuzu değiştirmeye gerek kalmadan). Tabi dilerseniz bu değerleri yok sayabilir ve reklam izlenince kaç altın kazanılacağını direkt Unity kodunuzda belirleyebilirsiniz.

Reklam birim(ler)inizi oluşturduktan sonra TAMAMLANDI butonuna tıklayarak işlemi sonlandırın. Reklam birimleri menüsünden yeni oluşturduğunuz reklama tıklayın ve gelen ekranda sağ üstten UYGULAMA TALİMATLARI‘na basın. Burada gözüken uygulama kimliğinizi ve reklam birimi kimliğinizi bir yere not edin (ca-app-pub- kısmını da ilave etmeyi unutmayın!):

DİKKAT: bu kimliklerinizi internette kimseyle paylaşmayın. Kimlikleriniz kötü niyetli birinin eline geçerse, bu kişi AdMob hesabınızı banlatabilir. Eğer reklam kodunuzu internette paylaşacaksanız, kimliklerinizi koddan silmeyi unutmayın.

Şimdi Android SDK‘yı açın ve Extras kısmından “Google Play services“ı kurun. Eğer zaten kuruluysa güncel olduğundan emin olun:

resim6

NOT: işinizi garantiye almak için, Google Play services’a ilaveten en son çıkan iki Android API’sini de yüklemenizi öneririm; örneğin Android 9.0 (API 28) ve Android 8.1 (API 27).

Android SDK’yı güncellemeyi bitirdikten sonra şu adımları izleyin:

  • Unity projenizi açıp Build Settings‘ten Platform olarak Android‘i seçin
  • Player Settings-Other Settings‘teki Minimum API Level‘ın en az “Android 4.0 ‘Ice Cream Sandwich’ (API level 14)” olduğundan emin olun
  • Assets-Import Package-Custom Package… yolunu izleyin ve daha önce indirdiğiniz GoogleMobileAds.unitypackage‘ı projenize import edin (import penceresinde tüm dosyalar seçili olmalı)
  • Project panelinde herhangi bir yere sağ tıklayın ve Play Services Resolver-Android Resolver-Resolve yolunu izleyin. İşlem bitene kadar bekleyin
  • Assets-Google Mobile Ads-Settings… yolunu izleyin. Inspector panelinde bir takım ayarlar gözükecek. Bu ayarlardan Google AdMob‘un altındaki Enabled‘ı işaretleyin ve Android’in yanındaki boşluğa uygulama kimliğinizi girin (kimliğin başında veya sonunda boşluk karakteri olmasın! Kodlarınızda reklam kimliklerinizi kullanırken de başta veya sonda boşluk olmadığından emin olun):

En nihayetinde gelelim reklamları uygulamamızda göstermeye…

a) Banner Reklamlar

Diyelim ki oyunun ilk sahnesinde, ekranın tepesinde bir banner reklam göstermek istiyorsunuz. O zaman Reklam adında yeni bir C# scripti oluşturun ve bu script’i sürükleyerek sahnenizdeki bir objeye component olarak verin:

using UnityEngine;
using GoogleMobileAds.Api;

public class Reklam : MonoBehaviour
{
	private BannerView reklamObjesi;

	void Start()
	{
		MobileAds.Initialize( reklamDurumu => { } );

		reklamObjesi = new BannerView( "ca-app-pub-3940256099942544/6300978111", AdSize.SmartBanner, AdPosition.Top );
		AdRequest reklamIstegi = new AdRequest.Builder().Build();
		reklamObjesi.LoadAd( reklamIstegi );
	}

	void OnDestroy()
	{
		if( reklamObjesi != null )
			reklamObjesi.Destroy();
	}
}

Kodda ilk olarak MobileAds.Initialize fonksiyonu ile Admob plugin’ini kullanıma hazır hale getiriyoruz. Bu fonksiyonu sadece bir kere çağırmanız yeterli.

Plugin’i initialize ettikten sonra, new BannerView() ile yeni bir banner reklam oluşturuyoruz ve bunu reklamObjesi değişkenine değer olarak veriyoruz. Bu fonksiyon 3 parametre alıyor:

  1. Banner reklam kimliğimiz: benim kodda girdiğim kimlik, Admob’un kendi sağladığı ve test reklamları almaya yarayan reklam kimliği. Henüz buraya kendi reklam kimliğinizi girmeyin, öncesinde cihazınızı test cihazı olarak tanıtmanız lazım ki kendi reklam kimliğinizle aldığınız reklamlar test reklamları olsun ve hesabınız yanlışlıkla banlanmasın (test cihazı eklemeyi birazdan göreceğiz). Ayrıca Admob’un sağladığı test reklam kimliğini kullanarak bir nevi kodumuzu da test ediyoruz, eğer kodu doğru yazdıysak oyunu başlatınca banner reklam göreceğiz: yeni oluşturulan reklam kimliklerine birkaç saat boyunca reklam gelmemesi sorunu, Admob’un test reklam kimlikleri için geçerli değil
  2. Banner reklamın ebatları: burada çeşitli seçeneklerimiz mevcut ancak en garantisi SmartBanner çünkü bu değer, telefonun ekran boyutuna ve o anki oryantasyonuna (Portrait, Landscape…) bağlı olarak en uygun reklam boyutunu otomatik olarak ayarlıyor. Eğer başka bir reklam boyutu belirlemek isterseniz, reklam boyutunun ekranın dpi cinsinden boyutundan büyük olmadığından emin olun; aksi taktirde banner reklamlarınız gözükmeyecektir (NOT: şu anda SmartBanner’la ilgili bir sıkıntı olabilir, eğer smart banner göstermeye çalıştığınızda veya oyun başladığında direkt uygulama kapanıyorsa, SmartBanner’ı Banner ile değiştirmeyi deneyin)
  3. Banner reklamın ekrandaki konumu: biz reklamın ekranın tepesinde gözükmesi için AdPosition.Top diyoruz ancak mesela ekranın altında gözükmesini istersek AdPosition.Bottom diyebiliriz

Reklam objesini oluşturduktan sonra, bu objeye Admob sunucularından reklam yüklemek için yeni bir AdRequest objesi oluşturuyoruz ve bu objeyi LoadAd fonksiyonu ile reklam objesine veriyoruz.

Son olarak da, OnDestroy içerisinde banner reklamımızı Destroy fonksiyonu ile yok ediyoruz. Reklam script’ini component olarak verdiğiniz obje yok olursa, otomatik olarak Reklam script’inin OnDestroy fonksiyonu çağrılır. Bu örnekte banner reklama erişim sağlayabilen tek script Reklam script’i olduğu için, eğer script yok olduğunda beraberinde banner reklamı da yok etmezsek, memory leak dediğimiz bir sıkıntı olur (hafızadaki banner reklam otomatik olarak yok olmaz ve hafızada yer kaplamaya devam eder) ve bunun tekrarlanması durumunda oyun çökebilir.

b) Interstitial Reklamlar

ReklamInterstitial adında yeni bir C# scripti oluşturun ve bunu sahnenizdeki bir objeye component olarak verin. Yapacağımız şey şu: ekranda bir buton olacak ve biz bu butona tıklayınca Interstitial reklam ekranda belirecek. Bunun için C# scriptinin içeriğini şöyle değiştirin:

using UnityEngine;
using System.Collections;
using GoogleMobileAds.Api;

public class ReklamInterstitial : MonoBehaviour
{
	private InterstitialAd reklamObjesi;

	void Start()
	{
		MobileAds.Initialize( reklamDurumu => { } );
	}

	// Ekranda test amaçlı "Reklamı Göster" butonu göstermeye yarar, bu fonksiyonu silerseniz buton yok olur
	void OnGUI()
	{
		if( GUI.Button( new Rect( Screen.width / 2 - 150, Screen.height - 300, 300, 300 ), "Reklamı Göster" ) )
		{
			if( reklamObjesi != null )
				reklamObjesi.Destroy();

			reklamObjesi = new InterstitialAd( "ca-app-pub-3940256099942544/1033173712" );
			AdRequest reklamIstegi = new AdRequest.Builder().Build();
			reklamObjesi.LoadAd( reklamIstegi );

			StartCoroutine( ReklamiGoster() );
		}
	}

	IEnumerator ReklamiGoster()
	{
		while( !reklamObjesi.IsLoaded() )
			yield return null;

		reklamObjesi.Show();
	}

	void OnDestroy()
	{
		if( reklamObjesi != null )
			reklamObjesi.Destroy();
	}
}

OnGUI fonksiyonu vasıtasıyla ekranda gösterdiğimiz butona bastıktan sonra new InterstitialAd() ile yeni bir interstitial reklam oluşturuyoruz (daha önceden bir interstitial reklam oluşturdu idiysek onu Destroy fonksiyonu ile yok ediyoruz). Ardından ReklamiGoster() coroutine’i vasıtasıyla reklamın sunucudan indirilmesini bekliyoruz. Reklamın henüz sunucudan inip inmediğini öğrenmek için InterstitialAd objesinin IsLoaded() fonksiyonunu kullanıyoruz. Reklam indikten sonra da Show() fonksiyonu vasıtasıyla reklamı ekranda gösteriyoruz.

Burada dikkat edilmesi gereken bir nokta, InterstitialAd objesinin Destroy fonksiyonu. Aynı fonksiyon BannerView için de mevcut. Bir reklamla işiniz bittiğinde, o reklam objesinden kurtulmadan önce Destroy fonksiyonu vasıtasıyla reklamın hafızada kapladığı yeri boşaltmalısınız. Aksi taktirde memory leak dediğimiz istenmeyen bir durumla karşı karşıya kalırsınız. Destroy fonksiyonu sadece banner ve interstitial reklamlar için geçerli; yani rewarded reklamlarda böyle bir durum yok.

Banner kodunda olduğu gibi, burada da Admob’un kendi sağladığı interstitial reklam kimliğini kullandım. Cihazımızı test cihazı olarak ekledikten sonra kendi reklam kimliklerimizi test etmeye hazır olacağız (birazdan göreceğiz).

c) Rewarded Video Reklamlar

ReklamRewardedVideo adında yeni bir C# scripti oluşturun ve bunu sahnenizdeki bir objeye component olarak verin. Bu script ile ekranda bir buton oluşturacak ve bu butona tıklayınca rewarded video reklam oynatacağız:

using UnityEngine;
using System.Collections;
using GoogleMobileAds.Api;

public class ReklamRewardedVideo : MonoBehaviour
{
	private RewardBasedVideoAd reklamObjesi;

	void Start()
	{
		MobileAds.Initialize( reklamDurumu => { } );
		reklamObjesi = RewardBasedVideoAd.Instance;
	}

	// Ekranda test amaçlı "Reklamı Göster" butonu göstermeye yarar, bu fonksiyonu silerseniz buton yok olur
	void OnGUI()
	{
		if( GUI.Button( new Rect( Screen.width / 2 - 150, 0, 300, 300 ), "Reklamı Göster" ) )
		{
			AdRequest reklamIstegi = new AdRequest.Builder().Build();
			reklamObjesi.LoadAd( reklamIstegi, "ca-app-pub-3940256099942544/5224354917" );

			StartCoroutine( ReklamiGoster() );
		}
	}

	IEnumerator ReklamiGoster()
	{
		while( !reklamObjesi.IsLoaded() )
			yield return null;

		reklamObjesi.Show();
	}
}

Bu kod interstitial reklam koduna fazlasıyla benziyor. Tek farkı, yeni bir reklam objesi oluşturmak yerine halihazırda var olan RewardBasedVideoAd.Instance objesini kullanıyoruz. Ayrıca Destroy kullanmıyoruz çünkü rewarded reklamlarda buna gerek yok.

Diğer reklam türlerinde olduğu gibi, bu script’te de Admob’un kendi sağladığı test reklam kimliğini kullandım. Cihazımızı test cihazı olarak tanımladıktan sonra kendi reklam kimliklerimizi test etmeye hazır olacağız (birazdan göreceğiz).

Artık oyunu Build alıp cihazda test edebiliriz. Reklamlar maalesef Unity’de test ederken gözükmüyor, bu yüzden oyunu illa ki bir Android cihazda veya emülatörde test etmelisiniz. Interstitial ve rewarded video reklamların gelmesi biraz sürebilir; hatta sunucuda yeterince reklam yoksa rewarded video reklam hiç gelmeyebilir de (fillrate sorunu).

Build Alma Sorunları

Oyunu build alırken sıkıntı yaşarsanız şu yöntemleri deneyebilirsiniz:

  • Eğer daha önce Bundle Identifier belirlemediyseniz, Player Settings-Other Settings-Bundle Identifier yolunu izleyerek oradaki değeri “com.SirketinizinAdi.OyununAdi” şeklinde değiştirin
  • Bilgisayarım’a sağ tıklayıp ÖzelliklerGelişmiş sistem ayarlarıOrtam Değişkenleri… yolunu izleyin. Eğer ne Kullanıcı Değişkenleri‘nde ne de Sistem Değişkenleri‘nde JAVA_HOME girdisi yoksa, herhangi bir Yeni… butonuna tıklayıp değerleri şöyle doldurun:

resim8

Eğer sizde “C:\Program Files\Java\jdk1.7.0_51” klasörü yoksa, kendi jdk klasörünüzü bulup Değişken değeri‘ne değer olarak onu yazın. Sonrasında Path isimli sistem değişkenini listeden bulup çift tıklayın ve Değişken değeri‘nin sonuna şunu ekleyin: “;C:\Program Files\Java\jdk1.7.0_51\bin” (eğer değişkenin değeri yukarıdan aşağıya liste olarak gözüküyorsa, baştaki ; işaretine gerek yok). Son olarak bilgisayarınızı yeniden başlatın.

  • SDK Manager‘da “Android SDK Build-tools“un son sürümü kurulu değilse kurun. Ardından Android SDK’nın kurulu olduğu klasördeki “android-sdk\build-tools\SON_SÜRÜM\zipalign.exe” dosyasını kopyalayın ve “android-sdk\tools” konumuna yapıştırın
  • JDK’nın 64-bit’lik sürümünü yüklediyseniz bir de 32-bit’lik sürümünü yüklemeyi deneyin
  • Belki saçma gelecek ancak bazen Admob ile alakalı hatalar, plugin ile gelen tüm dosyaları silip plugini yeniden import ederek çözülüyor (başıma geldi)

Reklam Gözükmemesi Sorunları

Her şeyi düzgün yaptığınıza inanmanıza ve hata almadan build alabilmenize rağmen bir türlü reklam göremiyor musunuz?

  • Eğer uygulama açılır açılmaz kendisini kapatıyorsa, yazının başlarında gösterdiğim GoogleMobileAdsSettings‘e uygulama kimliğinizi doğru girdiğinizden emin olun
  • Reklamları editörde değil cihazda test edin, reklamlar Unity editöründe gözükmez
  • Cihazınızın internete bağlı olduğundan emin olun
  • (Kendi reklam kimliğiniz ile test ediyorsanız) Eğer reklamı Admob üzerinden daha yeni oluşturduysanız, ertesi gün tekrar deneyin veya başka bir reklam kimliği kullanmayı deneyin. Henüz yeni oluşturulan reklam birimlerine reklam sağlan(a)madığını okumuştum
  • Eğer Gradle build system’ı kullanıyorsanız, Player Settings-Publishing Settings‘te yer alan Minify‘ı hem Release hem de Debug için None yapın
  • Bundle Identifier‘ı rastgele bir şekilde değiştirmeyi deneyin. Bunun sebebi; eğer başka birisi girdiğiniz o Bundle Identifier ile Admob reklamları sunarken ban yemiş ise, artık o Bundle Identifier’ı kullanan uygulamalarda Admob reklamları gözükmeyecektir
  • Play Services Resolver-Android Resolver-Force Resolve yapmayı deneyin
  • Uygulamanızı imzalayıp öyle build almayı deneyin (imzalama konusunda kısa bir rehber için: https://yasirkula.com/2014/04/17/unity-android-oyununuzu-google-playe-yuklemek/)
  • Android cihazınızın reklam kimliğini sıfırlamayı deneyin (“android reklam kimliğini sıfırla” şeklinde arama yapabilirsiniz)
  • Eğer uygulamanızı çoktan Google Play’de yayımladıysanız ama Google Play sayfasında “Fiyatlandırma ve dağıtım” kısmında yer alan “Reklam içerir” sorusunu “Hayır” olarak işaretlediyseniz, o seçeneği “Evet” yapın
  • logcat kullanarak bir hata alıp almadığınıza bakın. Örneğin bende rewarded video reklamlar çok ender gözüküyor ve genel olarak da fillrate hatası alıyorum, yani sunucuda herkese yetecek kadar reklam olmaması hatası. Bu gibi durumlarda elden bir şey gelmiyor maalesef (sadece Admob ile alakalı log’ları görmek için “adb logcat -s Ads” (tırnaksız) komutunu kullanabilirsiniz). Reklamlarla ilgili bir sorun yaşarsanız, lütfen bana danışmadan önce logcat’ten sorunun kaynağını tespit etmeye çalışıp sorunu internette hızlıca bir arayın

Test Reklamları ( **ÖNEMLİ** )

Kendi reklam kimlikleriniz ile reklamları test ederken cihazınızı test cihazı olarak tanıtmazsanız, Admob servisinden banlanabilirsiniz. Bu durumu engellemek ve oyunu kendi telefonunuzdan test ederken reklamların para kazandırmasını önlemek için izleyebileceğiniz iki yol var:

  • Admob’un Test İçin Olan Reklam Kimliklerini Kullanmak

Admob her reklam türü için birer adet test reklam kimliği sunmakta. Yukarıdaki script’lerde yer alan reklam kimlikleri de işte bu kimlikler. Bu kimlikleri kullanan reklamları test esnasında dilediğinizce gösterebilir, reklamlara tıklayabilirsiniz. Bu kimliklerin bir başka avantajı da, uygulamanızda bir türlü reklam gösteremediğiniz durumlarda, sorunun sizin reklam kimliklerinizden mi kaynaklandığını tespit etmek için kullanılabilmeleridir. Eğer kendi reklam kimliklerinizi kullanırken reklam gelmiyor ama test reklam kimliklerini kullanırken geliyorsa sorun sizin reklam kimliklerinizdedir; her iki durumda da reklam gelmiyorsa sorun Admob entegrasyonunuzdadır.

Güncel test reklam kimlikleri şöyle:

Banner: ca-app-pub-3940256099942544/6300978111

Interstitial: ca-app-pub-3940256099942544/1033173712

Rewarded: ca-app-pub-3940256099942544/5224354917

Tek yapmanız gereken, kodunuzdaki reklam kimlik(ler)ini test aşamasında bu kimlikler ile değiştirmek.

  • Cihazınızda Test Modunu Aktifleştirmek

Bu aşamanın önceki aşamaya göre bir avantajı, direkt kendi reklam kimlikleriniz üzerinden reklamları test edebilmenize olanak sağlamasıdır. Ayrıca test reklam kimliklerinin aksine, bu modda gösterilen reklamlar gerçek reklamlardır. Bu modda bir reklama tıkladığınızda para kazanmazsınız.

Cihazınız için test modunu aktifleştirebilemek için öncelikle cihazınızın özgün ID’sini bulmanız lazım. Bunun en garanti yolu da adb logcat kullanmak. İşinizi garantiye almak ve ban riskini önlemek için, öncelikle kodunuzdaki reklam kimliklerini yukarıdaki test reklam kimlikleri ile değiştirin ve ardından konsoldan adb logcat -s Ads komutunu çalıştırın. Uygulama esnasında reklam gösterirken logcat konsoluna şuna benzer log’lar gelecek:

Use AdRequest.Builder.addTestDevice(“CİHAZ_IDSİ”) to get test ads on this device (dipnot: bu log emülatörlerde gözükmez çünkü onlar için test modu otomatik olarak aktiftir).

Yapmanız gereken, reklam kodunuzun AdRequest kısmını şu şekilde güncellemek:

AdRequest reklamIstegi = new AdRequest.Builder().AddTestDevice("CİHAZ_IDSİ").Build();

Artık kendi reklam kimliklerinizi kullanabilirsiniz. Bundan böyle reklamlarınızın üzerinde ufak bir “Test Ad” yazısı gözükecek ve reklamlarınıza rahatlıkla tıklayabileceksiniz (bazen emülatörde interstitial reklam test ederken “Test Ad” yazısını görmüyorum, bu bir hata mı bilmiyorum ama “Test Ad” yazısı görmediğiniz zaman ne olur ne olmaz reklama tıklamamanızı öneririm).

Gelişmiş Özellikler

a) Banner Reklamlar

Şimdi dilerseniz, reklamlarla yapabileceklerimizi görmek amaçlı scriptlerimizi birazcık daha geliştirelim. Yapmak istediğimiz şey şu: banner reklam her iki saniyede bir belirip kaybolsun. Böylece istediğimiz zaman reklamı gizlemeyi, istediğimiz zaman geri getirmeyi göreceğiz.

using UnityEngine;
using GoogleMobileAds.Api;

public class Reklam : MonoBehaviour
{
	private float reklamBelirmeAni;
	private bool reklamDurumu = false;
	private BannerView reklamObjesi;

	void Start()
	{
		MobileAds.Initialize( reklamDurumu => { } );

		reklamBelirmeAni = Time.time + 2f;

		reklamObjesi = new BannerView( "ca-app-pub-3940256099942544/6300978111", AdSize.SmartBanner, AdPosition.Top );
		AdRequest reklamIstegi = new AdRequest.Builder().Build();
		reklamObjesi.LoadAd( reklamIstegi );
	}

	void Update()
	{
		if( Time.time >= reklamBelirmeAni )
		{
			reklamBelirmeAni = Time.time + 2f;
			reklamDurumu = !reklamDurumu;

			if( reklamDurumu )
				reklamObjesi.Show();
			else
				reklamObjesi.Hide();
		}
	}

	void OnDestroy()
	{
		if( reklamObjesi != null )
			reklamObjesi.Destroy();
	}
}

Update fonksiyonunda iki saniyede bir reklamDurumu‘nun değerini değiştiriyoruz ve değeri true ise reklamı Show() fonksiyonu ile gösteriyor, false ise Hide() fonksiyonuyla gizliyoruz. Bu kadar basit!

Burada şöyle bir ilave bilgi de vereyim: banner reklam objeleri scene geçişlerinden etkilenmez. Bu yüzden eğer bir banner reklamı diğer sahneye geçmeden önce gizlemezseniz, o reklam diğer sahnede de görünür halde olur.

Ayrıca madem bahsi geçmiş, tekrar hatırlatayım: eğer bir reklamla işiniz kesinlikle bittiyse, Destroy fonksiyonuyla o reklamın hafızada kapladığı yeri boşaltın. Örneğin A sahnesinde banner reklam gösteriyorsanız ama bu banner reklama B sahnesinde ihtiyacınız yoksa, A’dan B’ye geçmeden önce reklamObjesi.Destroy(); fonksiyonunu çağırın.

b) Interstitial Reklamlar

Eğer siz de Interstitial reklamları test ettiyseniz fark etmişsinizdir: reklamların yüklenmesi uzun sürebiliyor. Bunun için benim düşündüğüm yöntem, oyunun en başında reklam değişkeninde bir tane Interstitial reklamı hazır bulundurmak. Bu reklamı kullanıcıya gösterdikten ve kullanıcı reklamı kapattıktan hemen sonra ise yeni bir reklam alıp artık bu yeni reklamı değişkende depolamak. Böylece reklamlar, onları göstermek istediğimiz zaman elimizde hazır olacak ve reklamın gözükmesi için daha az bekleyeceğiz. Bunu yapmak için ReklamInterstitial scriptini şöyle değiştirin:

using UnityEngine;
using System.Collections;
using System;
using GoogleMobileAds.Api;

public class ReklamInterstitial : MonoBehaviour
{
	private InterstitialAd reklamObjesi;

	void Start()
	{
		MobileAds.Initialize( reklamDurumu => { } );
		YeniReklamAl( null, null );
	}

	// Ekranda test amaçlı "Reklamı Göster" butonu göstermeye yarar, bu fonksiyonu silerseniz buton yok olur
	void OnGUI()
	{
		if( GUI.Button( new Rect( Screen.width / 2 - 150, Screen.height - 300, 300, 300 ), "Reklamı Göster" ) )
		{
			StartCoroutine( ReklamiGoster() );
		}
	}

	IEnumerator ReklamiGoster()
	{
		while( !reklamObjesi.IsLoaded() )
			yield return null;

		reklamObjesi.Show();
	}

	public void YeniReklamAl( object sender, EventArgs args )
	{
		if( reklamObjesi != null )
			reklamObjesi.Destroy();

		reklamObjesi = new InterstitialAd( "ca-app-pub-3940256099942544/1033173712" );
		reklamObjesi.OnAdClosed += YeniReklamAl; // Kullanıcı reklamı kapattıktan sonra çağrılır

		AdRequest reklamIstegi = new AdRequest.Builder().Build();
		reklamObjesi.LoadAd( reklamIstegi );
	}

	void OnDestroy()
	{
		if( reklamObjesi != null )
			reklamObjesi.Destroy();
	}
}

c) Rewarded Video Reklamlar

Tıpkı üstteki interstitial kodunda olduğu gibi, rewarded video reklamın da oyunun en başında yüklenmesini sağlayalım. Kullanıcı reklamı kapattıktan sonra da otomatik olarak yeni bir video reklamı yükleyip hazırda bulunduralım. reklamObjesi‘nin IsLoaded() fonksiyonunu kullanarak, ekrandaki reklamı göstermeye yarayan butonun sadece reklam sunucudan tamamen indirilmişse tıklanabilir olmasını sağlayalım. Son olarak da, kullanıcı rewarded videoyu baştan sona izlerse ona ödül olarak 100 altın verelim:

using UnityEngine;
using System;
using GoogleMobileAds.Api;

public class ReklamRewardedVideo : MonoBehaviour
{
	private int altin = 0;
	private RewardBasedVideoAd reklamObjesi;

	void Start()
	{
		MobileAds.Initialize( reklamDurumu => { } );

		reklamObjesi = RewardBasedVideoAd.Instance;
		reklamObjesi.OnAdClosed -= YeniReklamAl;
		reklamObjesi.OnAdClosed += YeniReklamAl; // Kullanıcı reklamı kapattıktan sonra çağrılır

		YeniReklamAl( null, null );
	}

	// Ekranda test amaçlı "Reklamı Göster" butonu göstermeye yarar, bu fonksiyonu silerseniz buton yok olur
	void OnGUI()
	{
		GUI.Label( new Rect( 0, Screen.height / 2, 500, 150 ), altin + " altının var!" );

		// Butonu sadece reklam tamamen yüklenmişse (IsLoaded() true ise) tıklanabilir yap
		GUI.enabled = reklamObjesi.IsLoaded();

		if( GUI.Button( new Rect( Screen.width / 2 - 150, 0, 300, 300 ), "Reklamı Göster" ) )
		{
			reklamObjesi.OnAdRewarded -= OyuncuyuOdullendir;
			reklamObjesi.OnAdRewarded += OyuncuyuOdullendir; // Kullanıcı reklamı tamamen izledikten sonra çağrılır

			reklamObjesi.Show();
		}

		GUI.enabled = true;
	}

	public void YeniReklamAl( object sender, EventArgs args )
	{
		AdRequest reklamIstegi = new AdRequest.Builder().Build();
		reklamObjesi.LoadAd( reklamIstegi, "ca-app-pub-3940256099942544/5224354917" );
	}

	private void OyuncuyuOdullendir( object sender, Reward odul )
	{
		reklamObjesi.OnAdRewarded -= OyuncuyuOdullendir;

		Debug.Log( "Ödül türü: " + odul.Type );
		altin += (int) odul.Amount;
	}
}

Burada OyuncuyuOdullendir fonksiyonuna parametre olarak gelen Reward türündeki odul değişkeni, siz ödüllü reklamı Admob üzerinde oluştururken girdiğiniz “Ödül miktarı” (odul.Amount) ve “Ödül öğesi” (odul.Type) değerlerini depolamakta. Ben kendi reklamımı oluştururken “Ödül miktarı“nı 100 girmiştim ve bu yüzden altin değişkenim her seferinde 100 artıyor. Daha önceden de bahsettiğim gibi, burada işin güzel yanı, bu Reward parametrelerini oyunu güncellemeye gerek kalmadan direkt olarak Admob panelinden güncelleyebiliyorsunuz.

Ekstralar

1) Reklamı Kişiselleştirmek

Eğer ki yaptığınız oyun çocuklara yönelik ise ve(ya) oyununuzu Google Play‘e koyarken “Designed for Families” programına katılmayı seçerseniz, o zaman oyununuzda çocuklara yönelik reklamlar sunabilmeniz ve daha da önemlisi, reklamlarınızın görünebilmesi için kodda ufak bir değişiklik yapmanız gerekmekte:

AdRequest reklamIstegi = new AdRequest.Builder().TagForChildDirectedTreatment( true ).Build();

Çocuklara yönelik reklamlarda bilmeniz gereken iki husus var:

  • Çocuklara yönelik reklam veren daha az firma olduğu için, eğer bir reklam isteği yolladığınız anda Admob sunucularında çocuklara yönelik reklam kalmadıysa o reklam gözükmez
  • Oyununuzun Google Play’e kabul edilebilmesi için, oyun başlar başlamaz (oyun ilk açıldığında) interstitial reklam göstermemeye ve aynı anda birden çok reklam göstermemeye (mesela 2 banner reklam) özen göstermeniz gerekiyor (kaynak: https://play.google.com/about/families/ads-monetization/)

Çocuklara yönelik reklamlardan farklı olarak, dilerseniz göstermek istediğiniz reklamın hedef kitle etiketini de belirleyebilirsiniz. Örneğin hedef kitle yaşınıza en çok PG etiketi uyuyorsa, reklam kodunuzu şu şekilde güncelleyebilirsiniz:

AdRequest reklamIstegi = new AdRequest.Builder().AddExtra( "max_ad_content_rating", "PG" ).Build();

Bu arada belirtmeden geçmeyeyim, AdRequest’e birden çok değişikliği aynı anda uygulamanız mümkün. Örneğin hem AddTestDevice hem de AddExtra fonksiyonlarını kullanmak istiyorsanız:

AdRequest reklamIstegi = new AdRequest.Builder().AddTestDevice("CİHAZ_IDSİ").AddExtra( "max_ad_content_rating", "PG" ).Build();

2) Unity Ads Entegrasyonu (Mediation)

Admob’un özellikle rewarded video reklamlarda reklam havuzu zaman zaman yetersiz kalmakta ve fillrate hatası döndürmektedir. Bu tarz bir durumla daha az karşılaşmak (daha geniş bir reklam havuzuna sahip olmak) için, mediation denen sistem vasıtasıyla, uygulamalarınızda Admob’un reklamlarına ilaveten diğer popüler reklam firmalarının reklamlarını da gösterebilirsiniz.

Mediation’da bilinmesi gereken önemli bir nokta, mediation ile gösterilen reklamların ödemesi, Admob tarafından değil de mediation’ı yapılan firma tarafından sağlanır. Yani Unity Ads mediation’ı yaparsanız, uygulamanızda gösterilen Unity Ads reklamlarının gelirlerini Admob’dan değil Unity Ads’ten alırsınız ve bunun için ödeme bilgilerinizin Unity Ads’te yer alması gereklidir. Ben nasıl ödeme bilgilerinizi Unity Ads’e ekleyebileceğinizden de burada basitçe bahsedeceğim ancak şunu baştan bilin: Unity Ads’ten ödeme alabilmek için (bildiğim kadarıyla) bankanızda USD dolar hesabınızın olması lazım, çünkü para SWIFT ile buraya aktarılacak. Eğer henüz dolar hesabınız yoksa, dolar hesabı açana kadar paranın Unity Ads hesabınızda birikmesini talep etmeniz de mümkün.

Unity Ads mediation’ı banner, interstitial ve rewarded video reklamları desteklemektedir. Mediation’a başlamadan önce, Admob’da tanımlı banner/interstitial/rewarded video reklam kimlikleriniz olmalıdır. Mediation’ını bu reklam kimliklerinin üzerine uygulayacaksınız.

Faydalanılan kaynak: https://developers.google.com/admob/unity/mediation/unity

Öncelikle https://dashboard.unityads.unity3d.com/ adresine gidin, soldan Projects sekmesine geçiş yapın ve New Project butonuna tıklayın. “Project name“e projenizin ismini girin ve eğer uygulamanız özellikle 13 yaş altı çocuk kitlesine hitap ediyorsa, “This game is directed to children under the age of 13 in the United States” seçeneğini işaretleyin. “App Store ID“leri şimdilik boş bırakabilirsiniz. İşlemi tamamlamak için Add project butonuna tıklayın.

Reklam kimlikleri oluşturmak için projenizin ana sayfasında sol tarafta yer alan menüden Monetization-Placements yolunu izleyin ve Add Placement butonuna tıklayın. “Placement ID“e reklam kimliği için bir isim girin ve eğer banner reklam kimliği oluşturuyorsanız Banner, interstitial reklam kimliği oluşturuyorsanız Interstitial video, yoksa Rewarded video seçeneğini seçip Create Placement butonuna tıklayarak işlemi sonlandırın.

Unity Ads mediation’ınınızda not almanız gereken üç farklı değer var:

  • Reklam kimlik(ler)inizin “Placement ID”(ler)i: oluşturduğunuz bir reklam kimliğine tıklayınca gelen sayfadan öğrenebilirsiniz
  • GAME ID: sol taraftan Settings-Project Settings sekmesine geçiş yapınca “Google Play Store” satırında yer alır
  • API Key: sol üstten All projects‘e tıkladıktan sonra Ad Data Export-API Access yolunu izleyince gelen ekrandan öğrenilebilir

Artık Unity Ads reklam kimliklerini mediation vasıtasıyla Admob’a tanıtabiliriz. Bunun için şu yolu izleyebilirsiniz:

  • Admob hesabınıza giriş yaptıktan sonra soldan Uyumlulaştırma sekmesine geçiş yapıp UYUMLULAŞTIRMA GRUBU OLUŞTUR butonuna tıklayın
  • Reklam biçimi” olarak banner reklam için Banner, interstitial reklam için Geçiş, Rewarded video reklam için Ödüllü seçeneğini seçip DEVAM‘a tıklayın
  • Mediation için bir Ad girin
  • REKLAM BİRİMİ EKLE butonuna tıklayın ve Admob üzerinde halihazırda var olan ilgili reklam kimliğinizi seçip TAMAMLANDI‘ya tıklayın
  • Şelale reklam kaynakları bölümünde yer alan REKLAM KAYNAĞI EKLE butonuna tıklayıp Unity Ads‘i seçin (eğer bulamazsanız arama kısmına Unity Ads yazabilirsiniz)
  • API Key‘i Unity Ads’ten aldığınız key ile doldurup Yetkilendirme kutucuğunu işaretleyin
  • eBGBM kısmına bir değer girin (ben henüz bu konuda tecrübeli değilim, o yüzden buraya temsili olarak 2 girdim) ve DEVAM‘a tıklayın
  • Game ID ve Placement ID‘leri Unity Ads’ten aldığınız ID’lerle doldurup TAMAMLANDI butonuna tıklayın
  • KAYDET butonuna tıklayarak mediation (uyumlulaştırma) grubunuzu kaydedin

Eğer birden çok reklam türü için (banner, interstitial, rewarded video) Unity Ads mediation’ı ekleyecekseniz, tahmin edeceğiniz üzere her bir reklam türü için ayrı bir uyumlulaştırma grubu oluşturmalısınız.

NOT1: eğer rewarded video reklam için mediation uyguluyorsanız, Admob’daki rewarded video reklam kimliğinizin Ödül ayarları‘ndaki “Uyumlulaştırma grubundaki tüm ağlara uygula” seçeneğinin seçili olduğundan emin olun.

NOT2: uygulamanızı test ederken Unity Ads’ten de test reklamları almak için, Unity Ads arayüzündeki Settings-Project Settings sayfasından Test Mode satırının yanında yer alan “Google Play Store“a tıklayın, Override client test mode seçeneğini aktifleştirin ve “Force test mode ON“u işaretleyip Save butonuna tıklayın. Maalesef Admob kodunuz test modunda olsa bile bu ayar otomatik olarak Unity Ads’e işlemiyor, o yüzden böyle bir prosedür işliyoruz. Yalnız uygulamanızı yayınladıktan sonra override client test mode‘u kapatmayı unutmayın! Test moduna yapılan değişikliklerin reklamlara yansıması biraz vakit alabilir, o yüzden hemen niye olmuyor bu demeyin.

NOT3: uygulamanızı yayımladıktan sonra, Settings-Project Settings‘ten Store IDs satırının yanında yer alan “Google Play Store“un sağındaki Add Store Id butonuna tıklayarak, mağazadaki uygulamanızı Unity Ads’e bağlayabilirsiniz. Bunu yapmanın bir avantajı var mı bilmiyorum, o yüzden bunu yapıp yapmamak size kalmış. Ancak uygulamanızın burada gözükebilmesi için, uygulamayı yayımladıktan sonra birkaç gün beklemeniz gerekebilir.

Geriye sadece Unity Ads mediation’ı için gerekli şeyleri Unity’e import etmek kaldı. Bunun için şu adresteki en güncel versiyonun zip‘ini indirin: https://bintray.com/google/mobile-ads-adapters-unity/GoogleMobileAdsUnityAdsMediation#files

Zip’in içindeki unitypackage’ı dışarı çıkarıp Unity’e import edin (Assets-Import Package-Custom Package…). Ardından emin olmak için bir kere daha Play Services Resolver-Android Resolver-Resolve yapın. İşte bu kadar! Artık Admob reklam havuzunda reklam yoksa, otomatik olarak Unity Ads reklam havuzundan reklam çekilecek. Bu reklamların ödemesi ise Unity Ads tarafından sağlanacak.

O halde gelelim Unity Ads reklamlarının ödemesini alabilmek için ödeme bilgilerimizi girmeye. https://id.unity.com adresine giriş yapın ve soldan Organizations butonuna tıklayıp hesabınızı seçin. Ardından yine soldan Payout Profile sayfasına geçiş yapıp Add profile butonuna tıklayın. Eğer oyununuzu bir şirket ile değil de tek başınıza yaptıysanız “Payment recipient is“i Private individual yapın. Sonra diğer istenen bilgileri de doldurup Create butonuna tıklayın. “Full Name” ile ilgili bir hata alırsanız, isminizde Türkçe karakter kullanmayın.

Ödeme bilgilerinizi girmeden önce, vergi bilgilerinizi girmek için Payout Tax Info‘nun yanındaki Create butonuna tıklayın. Buradan sonra, sizden adım adım bir takım bilgiler girmeniz istenecek. Doğruya doğru, bu kısım gerçekten biraz karışık. Bu yüzden bu esnada yanınızda, İngilizce’den anlayan ve mümkünse daha önce bu tarz işlerle uğraşmış birinin olması oldukça işinize yarayacaktır.

Vergi işlemlerini tamamladıktan sonra artık ödeme bilgilerinizi girebilirsiniz. Bunun için Payout Method‘daki Add payout method butonuna tıklayın. Eğer henüz bir USD dolar hesabınız yoksa, paranın Unity Ads hesabınızda birikmesi için “Hold my payments“ı seçin ve işlemi tamamlayın. Dolar hesabınız varsa “Bank transfer” seçeneğini seçin. Minimum Payout Amount, Unity Ads hesabınızda ne kadar para biriktikten sonra, bu paranın bankanıza aktarılacağıdır. Ancak uluslararası para transferi demek aynı zamanda bankanın bundan komisyon alması da demek olduğu için (ilaveten Unity de 7.5 euro komisyon alıyor), transfer sayısını minimuma indirmek adına bu değeri yüksek tutmanızı öneririm. Sonrasında Add bank transfer details butonu ile, banka bilgilerinizi Worldpay sistemi üzerinden girebilirsiniz. Bankanızın SWIFT bilgilerini, bankanın web sitesi üzerinden bulmanız mümkün. Banka bilgilerinizi de girdikten sonra artık yapmanız gereken bir şey kalmıyor.

4) Singleton Reklam Scripti (Son Güncelleme 09.08.2019)

Admob dersim şimdiye kadar tahminimden çok daha fazla ilgi gördü. Ben de boş durmadım ve hem banner, hem interstitial, hem de rewarded reklamları bir arada destekleyen ve singleton pattern kullanan örnek bir script yazarak işinizi kolaylaştırmak istedim.

Oyunun ilk sahnesinde boş bir GameObject oluşturup içine aşağıdaki ReklamScript C# scriptini atın (scripti kameraya atmayın, içinde Transform hariç başka component olmayan boş bir objeye atın!):

using UnityEngine;
using System.Collections;
using System;
using GoogleMobileAds.Api;

public class ReklamScript : MonoBehaviour
{
	private static ReklamScript instance = null;

	[Header( "Kimlikler" )]
	public string bannerKimligi;
	public string interstitialKimligi;
	public string rewardedVideoKimligi;

	[Header( "Test Modu" )]
	public bool testModu = false;
	public string testDeviceID;

	[Header( "Diğer Ayarlar" )]
	public bool cocuklaraYonelikReklamGoster = false;
	public AdPosition bannerPozisyonu = AdPosition.Top;

	private BannerView bannerReklam;
	private InterstitialAd interstitialReklam;

	private float interstitialIstekTimeoutZamani;
	private float rewardedVideoIstekTimeoutZamani;

	private IEnumerator interstitialGosterCoroutine;
	private IEnumerator rewardedVideoGosterCoroutine;

	public delegate void RewardedVideoOdul( Reward odul );
	private RewardedVideoOdul odulDelegate;

	private bool BannerGosterebilirMi { get { return !string.IsNullOrEmpty( bannerKimligi ) || ( testModu && string.IsNullOrEmpty( testDeviceID ) ); } }
	private bool InterstitialGosterebilirMi { get { return !string.IsNullOrEmpty( interstitialKimligi ) || ( testModu && string.IsNullOrEmpty( testDeviceID ) ); } }
	private bool RewardedVideoGosterebilirMi { get { return !string.IsNullOrEmpty( rewardedVideoKimligi ) || ( testModu && string.IsNullOrEmpty( testDeviceID ) ); } }

	private void Awake()
	{
		if( instance == null )
		{
			instance = this;
			DontDestroyOnLoad( this );

			MobileAds.Initialize( reklamDurumu => { } );

			bannerKimligi = bannerKimligi.Trim();
			interstitialKimligi = interstitialKimligi.Trim();
			rewardedVideoKimligi = rewardedVideoKimligi.Trim();
			testDeviceID = testDeviceID.Trim();

			BannerReklamYukle();
			InterstitialReklamYukle();
			RewardedReklamYukle();
		}
		else if( this != instance )
			Destroy( this );
	}

	private void BannerReklamYukle()
	{
		if( !BannerGosterebilirMi )
			return;

		if( bannerReklam != null )
			bannerReklam.Destroy();

		if( testModu && string.IsNullOrEmpty( testDeviceID ) )
		{
#if UNITY_ANDROID
			bannerReklam = new BannerView( "ca-app-pub-3940256099942544/6300978111", AdSize.SmartBanner, bannerPozisyonu );
#elif UNITY_IOS
			bannerReklam = new BannerView( "ca-app-pub-3940256099942544/2934735716", AdSize.SmartBanner, bannerPozisyonu );
#endif
		}
		else
			bannerReklam = new BannerView( bannerKimligi, AdSize.SmartBanner, bannerPozisyonu );

		bannerReklam.OnAdFailedToLoad += BannerYuklenemedi;
		bannerReklam.LoadAd( ReklamIstegiOlustur() );
		bannerReklam.Hide();
	}

	private void InterstitialReklamYukle()
	{
		if( !InterstitialGosterebilirMi )
			return;

		if( interstitialReklam != null )
			interstitialReklam.Destroy();

		if( testModu && string.IsNullOrEmpty( testDeviceID ) )
		{
#if UNITY_ANDROID
			interstitialReklam = new InterstitialAd( "ca-app-pub-3940256099942544/1033173712" );
#elif UNITY_IOS
			interstitialReklam = new InterstitialAd( "ca-app-pub-3940256099942544/4411468910" );
#endif
		}
		else
			interstitialReklam = new InterstitialAd( interstitialKimligi );

		interstitialReklam.OnAdClosed += InterstitialDelegate;
		interstitialReklam.OnAdFailedToLoad += InterstitialYuklenemedi;
		interstitialReklam.LoadAd( ReklamIstegiOlustur() );

		interstitialIstekTimeoutZamani = Time.realtimeSinceStartup + 10f;
	}

	private void RewardedReklamYukle()
	{
		if( !RewardedVideoGosterebilirMi )
			return;

		RewardBasedVideoAd rewardedReklam = RewardBasedVideoAd.Instance;
		rewardedReklam.OnAdClosed -= RewardedVideoDelegate;
		rewardedReklam.OnAdClosed += RewardedVideoDelegate;
		rewardedReklam.OnAdRewarded -= RewardedVideoOdullendir;
		rewardedReklam.OnAdRewarded += RewardedVideoOdullendir;

		if( testModu && string.IsNullOrEmpty( testDeviceID ) )
		{
#if UNITY_ANDROID
			rewardedReklam.LoadAd( ReklamIstegiOlustur(), "ca-app-pub-3940256099942544/5224354917" );
#elif UNITY_IOS
			rewardedReklam.LoadAd( ReklamIstegiOlustur(), "ca-app-pub-3940256099942544/1712485313" );
#endif
		}
		else
			rewardedReklam.LoadAd( ReklamIstegiOlustur(), rewardedVideoKimligi );

		rewardedVideoIstekTimeoutZamani = Time.realtimeSinceStartup + 30f;
	}

	private AdRequest ReklamIstegiOlustur()
	{
		AdRequest.Builder reklamIstegi = new AdRequest.Builder();

		if( testModu && !string.IsNullOrEmpty( testDeviceID ) )
			reklamIstegi.AddTestDevice( testDeviceID );

		if( cocuklaraYonelikReklamGoster )
			reklamIstegi.TagForChildDirectedTreatment( true );

		return reklamIstegi.Build();
	}

	private void InterstitialDelegate( object sender, EventArgs args )
	{
		InterstitialReklamYukle();
	}

	private void RewardedVideoDelegate( object sender, EventArgs args )
	{
		RewardedReklamYukle();
	}

	private void BannerYuklenemedi( object sender, AdFailedToLoadEventArgs args )
	{
		if( bannerReklam != null )
		{
			bannerReklam.Destroy();
			bannerReklam = null;
		}
	}

	private void InterstitialYuklenemedi( object sender, AdFailedToLoadEventArgs args )
	{
		if( interstitialReklam != null )
		{
			interstitialReklam.Destroy();
			interstitialReklam = null;
		}
	}

	//private void OnGUI()
	//{
	//  Color c = GUI.color;

	//  if( GUI.Button( new Rect( Screen.width / 2 - 150, 0, 300, 120 ), "Banner Goster" ) )
	//      ReklamScript.BannerGoster();

	//  if( GUI.Button( new Rect( Screen.width / 2 - 150, 120, 300, 120 ), "Banner Gizle" ) )
	//      ReklamScript.BannerGizle();

	//  GUI.color = InterstitialHazirMi() ? Color.green : Color.red;
	//  if( GUI.Button( new Rect( Screen.width / 2 - 150, 240, 300, 120 ), "Interstitial Goster" ) )
	//      ReklamScript.InsterstitialGoster();

	//  GUI.color = RewardedReklamHazirMi() ? Color.green : Color.red;
	//  if( GUI.Button( new Rect( Screen.width / 2 - 150, 360, 300, 120 ), "Rewarded Goster" ) )
	//      ReklamScript.RewardedReklamGoster( null );

	//  GUI.color = c;
	//}

	public static void BannerReklamAl()
	{
		if( instance == null )
			return;

		instance.BannerReklamYukle();
	}

	public static void BannerGoster()
	{
		if( instance == null )
			return;

		if( instance.bannerReklam == null )
		{
			instance.BannerReklamYukle();
			if( instance.bannerReklam == null )
				return;
		}

		instance.bannerReklam.Show();
	}

	public static void BannerGizle()
	{
		if( instance == null )
			return;

		if( instance.bannerReklam == null )
			return;

		instance.bannerReklam.Hide();
	}

	public static bool InterstitialHazirMi()
	{
		if( instance == null )
			return false;

		if( instance.interstitialReklam == null )
			return false;

		return instance.interstitialReklam.IsLoaded();
	}

	public static void InterstitialReklamAl()
	{
		if( instance == null )
			return;

		if( instance.interstitialReklam != null && instance.interstitialReklam.IsLoaded() )
			return;

		instance.InterstitialReklamYukle();
	}

	public static void InsterstitialGoster()
	{
		if( instance == null )
			return;

		if( instance.interstitialReklam == null )
		{
			instance.InterstitialReklamYukle();
			if( instance.interstitialReklam == null )
				return;
		}

		if( instance.interstitialGosterCoroutine != null )
		{
			instance.StopCoroutine( instance.interstitialGosterCoroutine );
			instance.interstitialGosterCoroutine = null;
		}

		if( instance.interstitialReklam.IsLoaded() )
			instance.interstitialReklam.Show();
		else
		{
			if( Time.realtimeSinceStartup >= instance.interstitialIstekTimeoutZamani )
				instance.InterstitialReklamYukle();

			instance.interstitialGosterCoroutine = instance.InsterstitialGosterCoroutine();
			instance.StartCoroutine( instance.interstitialGosterCoroutine );
		}
	}

	public static bool RewardedReklamHazirMi()
	{
		if( instance == null )
			return false;

		return RewardBasedVideoAd.Instance.IsLoaded();
	}

	public static void RewardedReklamAl()
	{
		if( instance == null )
			return;

		if( RewardBasedVideoAd.Instance.IsLoaded() )
			return;

		instance.RewardedReklamYukle();
	}

	public static void RewardedReklamGoster( RewardedVideoOdul odulFonksiyonu )
	{
		if( instance == null )
			return;

		if( !instance.RewardedVideoGosterebilirMi )
			return;

		if( instance.rewardedVideoGosterCoroutine != null )
		{
			instance.StopCoroutine( instance.rewardedVideoGosterCoroutine );
			instance.rewardedVideoGosterCoroutine = null;
		}

		instance.odulDelegate = odulFonksiyonu;

		RewardBasedVideoAd rewardedReklam = RewardBasedVideoAd.Instance;
		if( rewardedReklam.IsLoaded() )
			rewardedReklam.Show();
		else
		{
			if( Time.realtimeSinceStartup >= instance.rewardedVideoIstekTimeoutZamani )
				instance.RewardedReklamYukle();

			instance.rewardedVideoGosterCoroutine = instance.RewardedVideoGosterCoroutine();
			instance.StartCoroutine( instance.rewardedVideoGosterCoroutine );
		}
	}

	private IEnumerator InsterstitialGosterCoroutine()
	{
		float istekTimeoutAni = Time.realtimeSinceStartup + 2.5f;
		while( !interstitialReklam.IsLoaded() )
		{
			if( Time.realtimeSinceStartup > istekTimeoutAni )
				yield break;

			yield return null;

			if( interstitialReklam == null )
				yield break;
		}

		interstitialReklam.Show();
	}

	private IEnumerator RewardedVideoGosterCoroutine()
	{
		RewardBasedVideoAd rewardedReklam = RewardBasedVideoAd.Instance;
		float istekTimeoutAni = Time.realtimeSinceStartup + 10f;
		while( !rewardedReklam.IsLoaded() )
		{
			if( Time.realtimeSinceStartup > istekTimeoutAni )
				yield break;

			yield return null;
		}

		rewardedReklam.Show();
	}

	private void RewardedVideoOdullendir( object sender, Reward odul )
	{
		if( odulDelegate != null )
		{
			odulDelegate( odul );
			odulDelegate = null;
		}
	}
}

Şimdi Inspector’dan Reklam Script‘teki Banner Kimliği, Interstitial Kimliği ve Rewarded Video Kimliği yazan yerlere ilgili kimlikleri yapıştırın. Kullanmadığınız reklam birimlerinin kimliklerini boş bırakabilirsiniz. Eğer Admob’un test reklam kimliklerini kullanarak reklamları test etmek isterseniz Test Modu‘nu aktifleşirin ama Test Device ID‘yi boş bırakın. Bu durumda script otomatik olarak test reklam kimliklerini kullanacak. Eğer cihazda test modunu aktifleştirerek kendi reklam kimlikleriniz üzerinden reklamları test etmek isterseniz de Test Modu‘nu aktifleştirin ve ilaveten Test Device ID‘ye cihaz ID’nizi girin. Oyununuz çocuklara yönelik ise ve(ya) Google Play’de Designed for Families programına katılmayı planlıyorsanız, o zaman Cocuklara Yonelik Reklam Goster seçeneğini işaretleyin; aksi taktirde oyununuzda reklamlar gözükmeyebilir. Son olarak da, Banner Pozisyonu değişkeni vasıtasıyla, banner reklamın ekranda gözükmesini istediğiniz yeri seçin. Varsayılan olarak bu değer AdPosition.Top, yani ekranın tepesidir ancak değerini AdPosition.Bottom yaparsanız banner reklam ekranın altında çıkar. Artık scripti kullanmaya hazırsınız.

Scriptin kullanımı oldukça basit: banner reklamı göstermek için ReklamScript.BannerGoster(); fonksiyonunu, banner reklamı gizlemek için ise ReklamScript.BannerGizle(); fonksiyonunu kullanabilirsiniz.

Interstitial reklam göstermek isterseniz ReklamScript.InsterstitialGoster(); fonksiyonunu kullanmanız yeterli. Eğer o esnada bir interstitial reklam yüklenmişse reklam anında gösterilir, yoksa yeni bir reklam yüklenmeye başlar veya mevcut yüklenmekte olan reklamın yüklenmesi beklenir. Eğer reklam 2.5 saniye içerisinde yüklenirse ekranda gösterilir, yoksa interstitial reklam gösterme isteğiniz başarısız olur. Bunun sebebi ise, reklamın siz bu fonksiyonu çağırdıktan onlarca saniye sonra anca yüklenmesi durumunda, oyunun ortasında *puf* diye ekranda belirerek kullanıcıları kızdırmasının önüne geçmek. Eğer ki sistem üzerinde biraz daha kontrol sahibi olmak isterseniz, ReklamScript.InterstitialHazirMi() fonksiyonu ile interstitial reklamın göstermeye hazır olup olmadığını (yüklenip yüklenmediğini) kontrol edebilir (ve ancak reklam hazırsa göster fonksiyonunu çağırabilir) veya ReklamScript.InterstitialReklamAl() fonksiyonu ile manual olarak bir interstitial reklam yükleme talebinde bulunabilirsiniz. Yüklenen bu reklam arkaplanda ReklamScript.InterstitialGoster() fonksiyonunun çağrılmasını bekler. Aslında singleton kod, sizin bu fonksiyonu çağırmanıza gerek kalmadan, gerektiğinde otomatik olarak yeni bir reklam yüklüyor ancak yine de böyle bir seçeneğiniz olduğunu bilin.

Gelelim rewarded video reklamlara. Kullanıcı bu reklamı baştan sona izlerse kullanıcıyı ödüllendirmek zorunda olduğunuz için, bu reklam biraz daha özel kategoriye giriyor. Rewarded video reklam göstermek için aşağıdaki örnek kodu inceleyebilirsiniz:

using UnityEngine;

public class RewardedGosterTest : MonoBehaviour 
{
	private int altin = 0;

	void OnGUI()
	{
		if( GUILayout.Button( "Rewarded reklam göster" ) )
		{
			ReklamScript.RewardedReklamGoster( RewardedReklamGosterildi );
		}
	}

	void RewardedReklamGosterildi( GoogleMobileAds.Api.Reward odul )
	{
		altin += (int) odul.Amount;
	}
}

Gördüğünüz üzere, rewarded reklam başarılı bir şekilde gösterilirse yapılacak şeyleri RewardedReklamGosterildi isimli, GoogleMobileAds.Api.Reward türünde odul parametresi alan bir fonksiyonda belirliyor ve ReklamScript.RewardedReklamGoster( RewardedReklamGosterildi ); fonksiyonu ile rewarded reklam gösterme talebinde bulunuyoruz. Böylece kullanıcı rewarded video reklamı izledikten sonra RewardedReklamGosterildi fonksiyonu çağrılıyor ve kullanıcı ödüllendiriliyor. Tıpkı interstitial’da olduğu gibi, rewarded reklamda da reklam çağrıldıktan sonra bir timeout mevcut ancak bu değer 2.5 saniye yerine bu sefer 10 saniye çünkü interstitial’ın aksine, genelde rewarded video reklamlar kullanıcının izniyle çağrılır (mesela kullanıcı ‘bedava coin’ butonuna tıklayınca) ve bu durumda kullanıcının 2.5 saniyeden daha uzun bir süre bekletilmesi normaldir. Ancak yine de, sadece bir rewarded reklam hazırda bekliyorsa ‘bedava coin’ butonunu aktifleştirmek istiyorsanız, ReklamScript.RewardedReklamHazirMi() fonksiyonu ile reklamın yüklenip yüklenmediğini kontrol edebilir veya uzun süredir rewarded reklam yüklenmediyse ReklamScript.RewardedReklamAl() fonksiyonu ile manual bir şekilde rewarded reklam talebinde bulunarak tekrar şansınızı deneyebilirsiniz.

Son olarak da, dilerseniz ReklamScript kodundaki OnGUI fonksiyonunun comment’ini kaldırarak reklam birimlerinizi test etmeye yarayan GUI butonlarını ekranda gösterebilirsiniz.

Script singleton’dan faydalandığı için sahne değişse bile yok olmuyor ve böylece bir önceki sahnede tanımladığınız bir reklamın kontrolü bir sonraki sahnede de elinizde oluyor.

Kanımca dersi böylece tamamlamış oldum. Umarım faydalı olmuştur. Başka derslerde görüşmek üzere!

yorum
  1. Mehmet dedi ki:

    Merhaba bir sorum olacaktı,
    admob’tan reklam idleri alıp sriptlere test devicelar ekleyerek çalıştırdığımda normal reklamlar çıkıyor üzerinde test reklamı diye bir etiket çıkıyor buraya kadar her şey normal, fakat test deviceları scriptlerden kaldırdığım zaman hiç bir reklam gelmiyor bunun sebebi ne olabilir acaba?

    AdRequest.Builder().addTestDevice(“biseylerbiseyler”).Build(); boyleyken sıkıntı yok,
    AdRequest.Builder().Build(); böyleyken sıkıntı var.

    Şimdiden teşekkür ederim.

    • yasirkula dedi ki:

      Anlayamadığım bir şekilde bu hatayı çok duymaya başladım ama sebebini henüz bulamadım. Ara ara resmî dokümantasyonu tekrar kontrol edip eksik bir şey var mı diye bakıyorum ama şu an için bir eksik de göremiyorum. Reklamları arkadaşlarınızın telefonlarında da test etmenizi öneririm, belki o cihazlarda sorunsuz görünür. Yurtdışında tanıdık varsa özellikle onların geribildirimi daha faydalı olur, ülkeler arası reklam havuzunda büyük farklılıklar olabilir.

      Deneme amaçlı, isterseniz MobileAds.Initialize(initStatus => { }); kodunu MobileAds.Initialize("UYGULAMA KİMLİĞİNİZ"); şeklinde değiştirmeye de şans verebilirsiniz.

      • Mehmet dedi ki:

        Öncelikle cevabınız için teşekkür ederim,

        yabancı kaynaklı bir sitede google play concole’da yayınlanmadığında admob reklam göndermeyi kesebiliyor denmiş, ben de bir deneyeyim dedim, yalnız 64 bit hatası aldım, ARMv7 ARM64 x86 üçü de tikli olmasına rağmen hatayı vermeye devam etti, x86yı kaldırınca kabul etti, bu da ayrı bir saçmalık, alpha testi yayınlayıp farklı telefonlarda test edeyim dedim, yanlışlıkla üretim kanalına yükseltmişim, bunu da geri alamıyormuşuz, sanırım olay tamamen benim cenabetliğim, her yerden sıkıntı yaşıyorum..

      • yasirkula dedi ki:

        Uygulamayı yayından kaldırmak için “Fiyatlandırma ve dağıtım” sekmesindeki butonları inceleyebilirsiniz. Bir önceki sürümü aktif hale getirmek sizin de dediğiniz gibi maalesef mümkün değilmiş. Tek yolu bir önceki sürümü daha yüksek bir sürüm numarası (Version Code) ile tekrar build alıp sonra tekrar Google Play’e yüklemek gibi duruyor. 64-bit hatasının x86’yı kapatınca çözülmesinin sebebi, x86’nın 32-bit olması. Buna karşılık gelen 64-bit’lik x64’e Unity destek vermediği için, Google Play’e artık x86 destekleyen oyun yüklemek mümkün değil.

      • Mehmet dedi ki:

        Şu an için yayınlanmak için beklemede, sanırım yayınlanmadan fiyatlandırma ve dağıtımdan yayını durduramıyoruz, yayınlandıktan sonra reklamlar çalışmıyorsa yayını durdurup reklam olayını çözünce dediğiniz gibi tekrar build alıp version yükselterek tekrar yayınlarım, reklamlar çalışıyorsa da zaten bilgilendirdiğiniz gibi x86 ile yayınlamak mümkün değilmiş, bu şekilde devam eder.
        Bu arada 64 bit hatası verdikten sonra yüklediğim apk’yı (ya da aab’ı) silip tekrar yüklerken de hata veriyordu, versiyonu yükseltmeden kabul etmiyor tekrar yüklemeye. Version yükseltip tekrar build almam gerekti, böyle bir sorun yaşayan olursa ek bilgi diye yazayım dedim.
        Her şey için teşekkür ederim, bilgiliendirme de yaparım burdan, benzer sorunlar yaşayanlar için faydalı olabilir..

      • Mehmet dedi ki:

        Çözüldü olay, şöyle ki, ana menü sahnesine boş bir obje ekleyip üzerine içinde sadece MobileAds.Initialize(initStatus => { }); olan bir script ekledim, emülatörde gözüktü reklamlar.
        tabi hala yayınlanmadı play’de, sürümü yükseltip bunu yükledim bakalım yayınlanacak mı..

        Çok sahneli ve her sahnede her reklam tipi yoktu reklam tiplerini de ayrı scriptlerle eklemiştim bu sebeple, bilmiyorum ama bunla alakalıydı belki.

        Her şey için teşekkür ederim, kolay gelsin.

      • yasirkula dedi ki:

        Çözebilmenize sevindim. Bilgi amaçlı soruyorum, kullandığınız reklam script’lerinde zaten MobileAds.Initialize satırı yok muydu?

      • Mehmet dedi ki:

        Vardı MobileAds.Initialize(appId) olarak ta hala duruyor ayrıca scriptlerde.

  2. Sinan Özcan dedi ki:

    Hocam merhaba, oyunuma reklam kodlarını eklediğimde oyun o kodu çalıştırdığında oyundan atıyor. Mesela örnek verirsek en basitinden butona basınca reklam çıksın dediğimde (kullandığım kod: ReklamScript.InsterstitialGoster(); ) direk oyundan atıyor

  3. Selim dedi ki:

    Hocam kolay gelsin öncelikle benim sorunum şu banner olması gereken pozisyonda görünmüyor maalesef yani şöyle söyleyeyim ekran oranı 1920×1080 cihazlarda olması gereken yerde fakat 18:9 cihazlarda tam altta değil biraz daha yukarıda duruyor bu konuyla ilgili araştırma yaptım fakat net bir sonuç bulamadım bilginiz varsa paylaşırsanız sevinirim.Teşekkürler
    Ek:(Burada konuyla ilgili bir konuşma mevcut)
    https://github.com/googleads/googleads-mobile-unity/issues/687

  4. Doğu Kemal şen dedi ki:

    Reklam Scriptinde 46. satırda hata oluştu diyor hocam

  5. berk dedi ki:

    hocam 2 aydan beri reklamlarla uğrasıyorum sizin scriptlere baya güvendim hiç değiştirmedim sorun sdk yada manifeste vb. gibi birseydedir dedim dün sizin scrptler yerine başka birininkini kullandım reklamlar gözüktü hata vermeden scriptiniz hatalı haberiniz olsun baya mağdur etti beni

  6. buğra dedi ki:

    Hocam test reklamları sorunsuz çalışıyor fakat kendi kimliğimi koyunca reklamlar gelmiyor.Ama o şekilde deneyip admob hesabıma girdiğimde sayıların değiştiğini gördüm ama reklam açılmıyor hiç.

  7. Merhaba Yasir Bey, Öncelikle bu muhteşem anlatım için çok teşekkürler. Bende test reklamları sorunsuz şekilde gösteriliyor fakat kendi reklam birimimi yazdığım zaman onLoadFailed e giriyor ve mesaj olarak “No Fill” mesajı ile reklam load yapamıyor. Google Admob’dan reklamlarınız gösterilmeye başladı maili geldi fakat reklamlar halen gözükmüyor yardımcı olur musunuz. Teşekkürler.

    • yasirkula dedi ki:

      İnternette bu konuyla ilgili araştırma yapınca hep, test reklamları düzgün görünüyorsa sıkıntı olmadığı ve biraz vakit geçince kendi reklamlarınızda da reklam görüneceği şeklinde yorumlar yer alıyor. Bir yorumda ise, uygulamayı imzalayıp test edince no fill hatasının gittiği yazıyordu, isterseniz uygulamayı imzalamayı deneyebilirsiniz. İmzalamaya şurada kısaca değindim ama Unity’nin son sürümlerinde biraz değişiklik olmuş olabilir: https://yasirkula.com/2014/04/17/unity-android-oyununuzu-google-playe-yuklemek/

      • Lütfullah TÜRKER dedi ki:

        AddTestDevice() fonksiyonu ile cihazımı test cihazı olarak ekledikten sonra test edince test reklamları gözüktü. Teşekkürler.

  8. SilentViper95 dedi ki:

    Hocam Merhabalar.. Admob hakkında bir sorum olacak. Bazı zamanlarda uygulamalarımda Banner reklamlarının gözükmediğini fark ettim ve bunu sebebi yüzünden Eşleşen İstekler ve Gösterim arasında baya bir fark oluşuyor. Kodlarda hata olabilir dedim ama öyle olsa Banner reklam hiç gözükmez. Eh onda hata yoksa nerede olabilir? Kodlar sizin yazdığınız kodlar. Her sahnede benimle birlikte geliyor, işleme göre reklamları gösteriyorum. Bu sorunu bir türlü aşamadım. Bu konu hakkında bilginiz var mı hocam?

    • yasirkula dedi ki:

      Reklamın gözükmediği durumlarda logcat’in döndürdüğü hata koduna bakmanızı öneririm. Tahminimce “ad failed to load: 3” döndürecektir, bu da çok büyük olasılıkla reklam havuzunun boş olmasına işaret ediyor. Banner’da bu sıkıntıyı yaşamamıştım ama belki de şu sıralar biraz havuzda kıtlık vardır ve ondan oluyordur.

  9. Buğra dedi ki:

    Hocam Play Services Resolver ın altında Android Resolver yok

  10. emre dedi ki:

    Merhaba
    Test id leri ile reklam gözükmesine , force resolve yapmama , reklam oluşturma süresinin gereken süreyi geçmesine rağmen kendi reklam id lerim ile reklam çıkmıyor
    Ne yapabilirim?

  11. eren dedi ki:

    Üstat Merhaba ben build alırken AndroidManifest.xml 51 tane hata alıyorum. Birde minumum api level en az 15 e kadar var 14 yok .

  12. emre dedi ki:

    Merhabalar
    Gelişmiş özelliklerdeki Interstitial Reklamları kullanıyorum
    Reklaklam sıklığı içinde bir array oluşturdum içinede 0 ve 1 lerden oluşan 5 tane eleman koydum
    Aksi takdirde istediğim şart her sağlandığında reklam gösteriyordu.
    Problemime gelecek olursak diziden random olarak bir değer seçip eğer bir gelirsede reklamı gösteriyorum yani show ve showLA birlikte başka komutlarda çalıştırıyorum.Örneğin audiosource ı enable yap gibi.Çünkü objem ilgili nesneye çarptığı reklam giriyor ve oyun bitiyor.Bende eğrelti durmasın diye sesi kesiyorum ve paralelinde showla birlikte başka işlemlerde yapıyorum
    Sorun ise internet bağlantısı olmadığında reklam gösterilmemesine rağmen randomdan gelen değer 1 ise show la birlikte aynı kontrol kümesinde olan komutlar çalışıyor.
    Sanırım benim internet bağlantısı olup olmadığı veya reklamın yüklenip yüklenmediğiyle ilgili bir şarta daha ihtiyacım var

  13. tolgaguducu dedi ki:

    Merhaba,
    Googledan gelen bir mail var. “app-ads.txt dosyanızı zorunluluk başlamadan önce doğru bir şekilde yapılandırın” şu şekilde.
    bu konu hakkında bi bilginiz var mı?
    bu olayı nasıl halledebiliriz? dilerseniz mailin içeriğini de atabilirim.

  14. Furkan dedi ki:

    Hocam var olan reklamı gizleyip göstermek ile reklamı destroy edip yeni reklam alıp göstermek aynı kazancı mı sağlar?

    • yasirkula dedi ki:

      Banner kendi kendini yenileyen bir reklam olduğu için banner’ı destroy edip yeni reklam almanızı önermem, AdMob ekibinin bir bildiği vardır diye düşünüyorum. Ama bunun kazanca olumsuz etkisi var mı bilmiyorum.

  15. Enes K dedi ki:

    Yasir abicim gözünü seveyim bir yardım et reklam ekleyeceğim diye 2 aydır uğraştığım oyunu bozdum delirmek üzereyim.

    FormatException: Input string was not in a correct format.
    System.Number.StringToNumber (System.String str, System.Globalization.NumberStyles options, System.Number+NumberBuffer& number, System.Globalization.NumberFormatInfo info, System.Boolean parseDecimal) (at :0)
    System.Number.ParseInt32 (System.String s, System.Globalization.NumberStyles style,

    böyle bir hata alıyorum nereden kaynaklanıyor bulamadım internetten baktım bi sonuç bulamadım
    saatlerdir şuna uğraşıyorum acil yardımınızı bekliyorum lütfen

  16. asy537 dedi ki:

    Eğer reklam kimliğinizi doğru yazmanıza rağmen oyun açıldıktan sonra kapanıyorsa banner reklam türünü smart harici birşey seçin smart reklamlarda şu an sıkıntı varmış. https://groups.google.com/forum/#!msg/google-admob-ads-sdk/T44iu1d27j4/iOHIvEDyAAAJ

    • Bekir dedi ki:

      Allah razı olsun 4-5 saattir uğraşıyorum hiç aklıma gelmezdi sorunun google dan kaynaklanabileceği.

  17. Oguzhan dedi ki:

    Hocam 2 tane sıkıntım var yardımcı olursanız sevinirim

    -1.sıkıntım hocam oyun açıldığında telefonda tam ekran modunu nasıl açtırabilirim edebilirim
    -2.sıkıntım hocam oyununda reklamı önceden yükleyip onu sonra nasıl gisteririm

  18. emre dedi ki:

    Merhabalar
    Oyunumda banner reklam olarak ilk anlattığınız yalın,görünüp kaybolmayan banner anlatımını kullanıyorum.
    Ancak oyunum tek sahneden oluşuyor.Skor ve nesnelerin konumu ve farklı parametreler oyun ilerledikçe değişiyor.Ve ben de oyuncu replaye bastığında hepsini teker teker sıfırlamak yerine sahneyi baştan yükle diyorum.Ancak o zaman alttaki banner reklam kayboluyor ve oyun ilk açıldığı zaman ki gibi beklenip yükleniyor ve öyle gösteriliyor.Bense sahneyi yeniden yüklememe rağmen reklam akışının devam etmesini istiyorum.Bunu nasıl önleyebilirim?(banner scripti de haliyle aynı sahne içinde o da herhal yeniden yükleniyor sanırsam ve destroy da çalışıyor olabilir mi?)

    • yasirkula dedi ki:

      OnDestroy fonksiyonunu script’ten kaldırıp “private BannerView reklamObjesi;” yerine “private static BannerView reklamObjesi;” yapın. Start fonksiyonunun başına da if(reklamObjesi!=null) return; yazın.

  19. Nuri dedi ki:

    Çok faydalı bilgiler vermişsiniz teşekkürler. Benim şöyle bir sorunum var. Ödüllreklamlarda birkere ödül veriyor. Sahneyi yeniden başlatsam bile video çıkıyor ama ödül verme kısmındaki komutlar çalışmıyor. Oyundan çıkınca tekrar girince yine bir sefer çalışıyor sonra birdaha ödül vermemye başlıyor. Admobun kendi sitesindede baktım reklam kapanınca yeniden çağırın diyor aynısını yapıyorım ama yinede video gösteriliyor ama ödül kısmı çalışmıyor. Zaten sehne yeniden başlayınca yeni reklam istemiş olmuyormuyuz neden oyundan komple çıkmak geeekşyor bir fikriniz varmı acaba?

  20. ilkin dedi ki:

    C:\Program Files\Android\android-sdk\build-tools\29.0.2\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “C:/Program Files/Android/android-sdk\platforms\android-28\android.jar” -F bin/resources.ap_

  21. yiğit dedi ki:

    InterstitialAd interstitial;

    private void Start()
    {
    MobileAds.Initialize(“uyg kimliği”);
    RequestBanner();
    if(SceneManager.GetActiveScene().name!=”GameUI”)
    Invoke(“RequestInterstitial”, 5f);
    }

    private void RequestBanner()
    {
    BannerView bannerView = new BannerView(“Banner reklam id”, AdSize.SmartBanner, AdPosition.Bottom);
    AdRequest request = new AdRequest.Builder().Build();
    bannerView.LoadAd(request);
    }

    private void RequestInterstitial()
    {
    interstitial = new InterstitialAd(“geçiş reklam kimliği”);
    AdRequest request = new AdRequest.Builder().Build();
    interstitial.LoadAd(request);
    }

    public void LoadInterstitial()
    {
    if (interstitial.IsLoaded())
    {
    interstitial.Show();
    RequestInterstitial();
    }
    }

    hocam bu kodda reklamın daha hızlı çıkmasını nasıl sağlarım anca bi 8-9 saniye çıkıyor böyle

  22. Felix dedi ki:

    Hocam oyunu telden denediğimde çöküyor direk 20 günden beri bununla uğrasıyorum son güncelemenizide denedim yine olmadı yardım ederseniz çok sevinirim

    • yasirkula dedi ki:

      Son güncelleme ile yazıyı bir miktar güncelledim, baştan sona gerekli her adımı uyguladığınız halde aynı sıkıntı devam ediyorsa, “Assets-Google Mobile Ads-Settings…”inizin resmini yasirkula@gmail.com‘a atabilirsiniz.

      • Ersan Karan dedi ki:

        Aynı hatayı test id ile denerken aldım. Kendi banner id’lerimi falan kullanırken hata vermiyor. Sorun “Assets-Google Mobile Ads-Settings” kısmında girmemiz gereken app id olmamasından kaynaklanıyor olabilir mi?

      • yasirkula dedi ki:

        Girmeniz gereken app id yokken kendi banner id’lerinizin de aynı hatayı vermesi lazım. Biraz yukarılardaki bir yorumda smart banner’ın şu an için sıkıntılı olduğu yazıyor (kendim test ederken sıkıntı yaşamadım), belki ondandır.

      • Ersan Karan dedi ki:

        Kendi App Id kodumu yazınca oraya hata vermiyor. Fakat test için herhangi bir kod verilmemiş o bölüm için bunu demek istemiştim.

      • yasirkula dedi ki:

        Orada daima kendi app id’niz yazmalı. Sadece reklam id’leri kendi id’niz veya test id’si arasında değişebilir.

      • Ersan Karan dedi ki:

        Çözdüm şu an çalışıyor. “Assets-Google Mobile Ads-Settings konumuna ca-app-pub-3940256099942544~3347511713 bu test kodunu girdim. Buradaki sorun banner ve diğer reklam id’lerin uyumlu bir app id ile çalışmaması olabilir. Aynı sorunu yaşayanlar bunu deneyebilir.

  23. berk dedi ki:

    uygulmayı build aldıgımda, telefonda denediğimde, uygulama durduruldu hatası veriyor.
    kodlardamı sorun var hocam

  24. Yigit dedi ki:

    Hocam acaba application.loadlevel kullanarak butona basinca 5 saniye sonra diger bolume geçmesini nasıl yapabilirim cunku reklamlarimi baska bir projede test ettim butona basıyorum baska bir bolume geçmediği icin açılıyor fakat kendi oyunum da butona basıyorum diger bolume gectigi icin reklam cikmiyor acaba diyorum butona basayım bi 5 saniye beklesin reklam ciksin sonra oyun acilsin nasıl bi kod yazılabilir

    • yasirkula dedi ki:

      void A()
      {
      Invoke(“B”, 5); // B fonksiyonunu 5 saniye sonra çalıştırmaya yarar
      }

      void B()
      {
      // …
      }

      • ADS dedi ki:

        Hocam ben reklamı dediğiniz gibi yaptım fakat ne kadar reklam butonuna bassamda reklam hiç çıkmadı araştırdım Google ads havuzu azmis fakat hiç mi çıkmaz onu anlamadım nolur bı yardım edin

        Hocam ayrıca mesajla adam oyunu oynuyor bu arada reklam arkada depolamada mesajla adam bastığında bu reklam çıksa öyle bir şey ölümü

        Kocam şu iki sikindima yardım ederseniz sevinirim

      • yasirkula dedi ki:

        Logcat ile aldığınız hata mesajını kontrol etmenizi öneririm: https://yasirkula.com/2015/10/13/unity-android-oyunlarinizi-debug-etmek/

        Mesajla oyunu oynamaktan kastınız nedir? Bildiğiniz SMS ile link vs. atarak mı oyun oynanıyor veya bir şekilde Facebook’un sohbet uygulaması üzerinden mi oynanıyor? Eğer böyle bir şeyse maalesef bir fikrim yok :/

      • ADS dedi ki:

        Hocam yanlış yazmışım kusura bakmayın yani şunu söylemek istedim reklamı önceden hazır etsek ve kişi butona tıkladığında o gelse hazır reklam bunu nasıl yapabilirim

        Ayrıca hocam ben sizin dediklerimiz yaptım fakat reklam gelmiyor kodu attığım butona 100 kez tiklamisimdir anlamadım gitti hocam

      • yasirkula dedi ki:

        “Gelişmiş Özellikler” başlığı altında reklamları önceden hazır hale getiriyoruz, oraya bakabilirsiniz. Paylaştığım ReklamScript de aynı işi yapıyor, ona da göz atabilirsiniz.

        Reklamların çalışmama sebebini tespit etmeye yardımcı olması için logcat ile aldığınız hata mesajını kontrol edin: https://yasirkula.com/2015/10/13/unity-android-oyunlarinizi-debug-etmek/

      • MERT dedi ki:

        Ads adlı kişinin aldığı sorun bende de var reklamı hiçbir zaman açmıyor ne kadar tıklanan tiklayim

  25. yiğit dedi ki:

    hocam failed to load 2 ve failed to load ad 1 nedir

    • yasirkula dedi ki:

      Failed to load ad 1: Uygulama kimliği veya reklam kimliği yanlış girildiğinde çıkar.

      Failed to load ad 2: İnternet bağlantısında sıkıntı olduğunda çıkar. Eğer cihaz internete bağlıysa cihazı yeniden başlatmak, veya cihazın tarihini elle ayarladıysanız onu şebeke tarafından otomatik tarihe almak sorunu çözebilir.

  26. Berk Uçmaz dedi ki:

    yasirkula hocam bir sorum vardıda aklıma gelmedi nasıl yapabileceğim
    oyunumda oyuncunun ödüllü reklama tıkladıgı zaman öldüğü yerden geri doğmasını istiyorum bunu nasıl yapabilirim
    not: oyunumda tek bir obje yok kontrol edilen bir top var ve altında onun sağa sola yuvarlanmasını sağlayan tahta var. top ve tahta 2 ayrı obje, top cisimlere çarptıgında oyun son buluyor

    • yasirkula dedi ki:

      En basitinden, oyun bitince Time.timeScale’i 0 yapıp OyuncuyuOdullendir fonksiyonunda Time.timeScale’i geri 1 yapabilirsiniz. Ama kullanıcı ana menüye dönmek isterse, SceneManager.LoadScene yapmadan önce de timeScale’i 1 yapmayı unutmayın.

  27. yiğit dedi ki:

    hocam test reklamını yaparken uygulama kimliği yerine ne yazacağız

    • yasirkula dedi ki:

      Uygulama kimliğiniz aynı kalabilir, sadece reklam kimliklerinizi değiştirmeniz yeterli.

      • Yigit dedi ki:

        Hocam test reklamları calisiyor fakat kendi reklamları mı bir türlù calistiramadim butun her seyi denedim olmuyor.

      • yasirkula dedi ki:

        Yardımcı olmak istiyorum ama “Reklam Gözükmemesi Sorunları” başlığındaki hiçbir şey işe yaramıyorsa maalesef benim de elimden bir şey gelmiyor. İsterseniz yeni bir Unity projesi açıp Bundle Identifier’ını da farklı bir şey girin ve orada reklamlarınızı göstermeyi deneyin.

      • yiğit dedi ki:

        hocam yeni açtığım projede de reklamlarım gözükmüyor

      • yasirkula dedi ki:

        Eğer rewarded reklam deniyorsanız, bir de interstitial veya banner deneyin. AdMob’da ödüllü reklamlar, mediation kullanmadan kolay kolay gözükmüyorlar çünkü Türkiye’de nedense AdMob’a ödüllü reklam veren firma sayısı çok değil.

      • yiğit dedi ki:

        geçiş reklamı kullanıyorum hocam ödüllü değil

      • yiğit dedi ki:

        hocam logcattan tekrar baktım yine failed to load ad 3 diyor oyunu google playa koysam reklam gelmeye başlar mı?

      • yasirkula dedi ki:

        Google Play’e koyunca bir şey değişeceğini sanmıyorum. İnternette hep failed to load ad 3 hatası ile ilgili, kodunuzun doğru olduğu ama sadece server’da reklam olmadığı şeklinde mesajlar yer alıyor. Bence siz de “admob failed to load ad 3” şeklinde arama yapıp kendiniz bakın çünkü benim elimden gelen bir şey yok maalesef. Ayrıca bence uygulamayı başka Android cihazlarda da test edin. Eğer yurt dışında arkadaşınız varsa, özellikle onlara test ettirin, bir de orada nasıl oluyor ona bakın.

      • yiğit dedi ki:

        hocam çok soru sorduğumun farkındayım kusura bakmayın
        bu sefer farklı bir admob hesabı ile reklamı denedim bu sefer de logcatta bu hatayı verdi
        W/Ads: Received error HTTP response code: 400
        W/Ads: There was a problem getting an ad response. ErrorCode: 0
        W/Ads: Failed to load ad: 0

      • yasirkula dedi ki:

        Reklamları yeni oluşturduysanız olabilir. Şu anda da aynı hatayı veriyorsa test reklam kimlikleri ile de reklam almayı deneyin. Ve reklamları sadece kendi cihazınızda test etmeyin, başka cihazlarda da test edip sorun sizin cihazınızda mı kontrol edin.

      • Yigit dedi ki:

        4 farkli telefonda denedim yine failed to load 3 alıyorum anlamadim bu isi bosuna 1 yilimi harcamisim gibi geliyor 1 haftadir hic sonuc alamadim internette ki her seyi arastirdim hic biri ise yaramadi iyice ümidimi kaybediyorum.

      • yiğit dedi ki:

        hocam Unity Ads Entegrasyonu yapsam reklam gelmeye başlar mı son çarem sanırım bu

      • yasirkula dedi ki:

        Ben test ederken rewarded reklamların gelme olasılığını bayağı artırmıştı.

      • yiğit dedi ki:

        hocam denedim 1 kere çalıştı sonra yine failed to laod ad 3 dedi neymiş bu hata peşimi bırakmıyor

      • yiğit dedi ki:

        yahu başka proje açıp orda deniyorum çalışıyor kendi projem de çalışmıyor değişik

      • yiğit dedi ki:

        hocam basınca hem reklamın çıkmasını hem de bölümü geçmesini sağlicak buton nasıl yapabilirim

      • yiğit dedi ki:

        normalde bölümü geçicek butonum var ve reklam butonunuda üstüne koyuyorum tek tıklayışta ikisine de basma mantığı ile yaptım fakat öyle yapınca failed do load ad 3 hatası alıyorum sadece reklam butonuna basınca ise reklamlar çıkıyor tek buton da ikisini de yapabilir miyim

      • yasirkula dedi ki:

        Çok ilginç bir sorunmuş 😀 İsterseniz şöyle bir kod deneyebilirsiniz:

        public void ButonaBasildi()
        {
        	if( reklamObjesi.IsLoaded() )
        	{
        		// reklam kapatıldığında SonrakiLeveliYukle fonksiyonu çağrılır
        		reklamObjesi.OnAdClosed -= SonrakiLeveliYukle;
        		reklamObjesi.OnAdClosed += SonrakiLeveliYukle;
        		
        		reklamObjesi.Show();
        	}
        	else // hazırda reklam yoksa direkt sonraki level'a geç
        		SonrakiLeveliYukle();
        }
        
        private void SonrakiLeveliYukle()
        {
        	reklamObjesi.OnAdClosed -= SonrakiLeveliYukle;
        	
        	SceneManager.LoadScene("Sonraki Scene"); // sonraki level'a geçme kodu
        }
        
    • berk dedi ki:

      dostum indirdiğin pllugins dosyasında sorun var bendede aynı şeyler oldu güncelleme getirmeleri gerekiyor ben arkadastan düzgün çalısanını buldum düzeldi baya uğrastım 10 gün süremi aldı hayattan soğudum

  28. yiğit dedi ki:

    hocam ben de reklam gözükmüyor android manifestte nereleri değiştirmemiz gerekiyor sadece admob application ıd yerini mi dolduracağız yoksa başka yerlerde de değişiklik yapacak mıyız

    • yasirkula dedi ki:

      AndroidManifest’te sadece application id değişiyor. Zaten oyun açar açmaz çökmüyorsa doğru değiştirmişsinizdir. Reklamları sadece cihazda test edebilirsiniz, editörde reklamlar gözükmez. Cihazda da gözükmüyorsa logcat vasıtasıyla aldığınız hata kodunu bulmanız lazım: https://yasirkula.com/2015/10/13/unity-android-oyunlarinizi-debug-etmek/

      • yiğit dedi ki:

        1–I/Ads: Use AdRequest.Builder.addTestDevice(“4FA5DF1CD69F955899BB56EFFCC7134F”) to get test ads on this device.
        2–W/Ads: App does not have the required permissions to get location
        3–I/Ads: SDK version: afma-sdk-a-v16187999.15000000.1
        4–I/Ads: Ad failed to load : 3
        ve bu 4 tane yazıyı gösteriyor

      • yasirkula dedi ki:

        Sorunu anlıyorum ama lütfen birden çok mesaj atarak spam yapmayın. Aldığınız hata, sunucuda reklam olmadığını söylüyor. Öncelikle isterseniz test reklamlarının çıkıp çıkmadığını kontrol edin. Ardından Android cihazınızın reklam kimliğini sıfırlamayı deneyin (“android reklam kimliğini sıfırla” şeklinde arama yapabilirsiniz). Eğer uygulamanızı Google Play’de yayımladıysanız ama Google Play sayfasında “Fiyatlandırma ve dağıtım” kısmında yer alan “Reklam içerir” sorusunu “Hayır” olarak işaretlediyseniz, o seçeneği de “Evet” yapmanız da gerekiyor(muş).

      • Yigit dedi ki:

        Kusura bakmayın hocam mesajların gitmedigini zannedip attım

  29. Bünyamin dedi ki:

    Hocam geçiş reklamının bitip bitmediği nasıl anlayabiliriz?
    Hemen bititminde bir şeyler yapmak istiyorum da.

    • yasirkula dedi ki:

      Şu şekilde interstitial reklamın OnAdClosed event’ine kaydolabilirsiniz:

      reklamObjesi.OnAdClosed -= ReklamKapatildi;
      reklamObjesi.OnAdClosed += ReklamKapatildi;

      Aynı script’te şu şekilde ReklamKapatildi fonksiyonu oluşturmanız lazım:

      public void ReklamKapatildi( object sender, EventArgs args )
      {
      }

  30. yiğit dedi ki:

    hocam her seyi yaptım fakat apk olarak çıkartıp telefona kurunca oyun açılmıyor

  31. Bünyamin dedi ki:

    Hocam hangi reklamların çıkacağını biz belirleyebilir miyiz

    • yasirkula dedi ki:

      Siz uygulamanızın sosyal ağlarda reklamını yapmak istiyorsunuz o zaman. Bu plugin bu konuda işinize yaramaz çünkü bu plugin ile paylaşım yapabilmek için uygulamanın zaten kurulu ve o anda çalışıyor olması lazım. Galerinizde bir resmi seçip “Paylaş”a tıklamak gibi düşünün, bu plugin’in yaptığı tek şey sosyal medyada içerik paylaşmak.

      Facebook’ta reklam vermek için: https://www.facebook.com/business/ads

  32. tolgaguducu dedi ki:

    merhaba,
    şöyle bir sorum var:
    banner reklamı oyunun en başında vermek yeterli mi?
    Hali hazırda oyunumda banner reklamları her seviye başlayınca aktifleştiriyorum. fakat destroy meselesini çözemedim. eski reklamlar gizleniyor fakat tam anlamıyla yok olmuyorlar diye düşünüyorum. bu durumda oyunu oynayan sıkıntılar yaşar mı? veya eski reklamları belli bir süre sonra gizlemek yerine nasıl yok edebilirim?

    • yasirkula dedi ki:

      Bir daha kullanmayacağınız bir banner’ın Destroy fonksiyonunu çağırmazsanız o reklam yok olmaz, evet. Yani Hide() ile reklamı gizledikten sonra bir daha ellemezseniz reklam hafızada yer kaplamaya devam eder. Banner’ın Destroy() fonksiyonunu çağırırsanız banner tamamen yok edilir. Ama bence Destroy kullanmak yerine tek bir banner objeniz olsun (gerekirse static yapın) ve sürekli onu Show() ve Hide() yaparak banner gösterin (ReklamScript de tek bir banner kullanıyor).

  33. Espect dedi ki:

    Hocam biz banner reklamı yaptık fakat gözükmüyor hic bir sıkıntıda almadık sizce nedeni ne yardımcı olursanız cok sevinirim

  34. emre dedi ki:

    Merhabalar
    Banner reklamları özel olarak anlattığınız bölümde Adrequest işlemini sadece bir kere Start kısmında yapıyoruz bu durumda zamana bağlı olarak farklı banner reklamlar çıkacak mı?
    İkinci sorum sadece interstitial reklamları anlattığınız kısmında şöyle bir kısım var
    reklamObjesi.OnAdClosed += YeniReklamAl; // Kullanıcı reklamı kapattıktan sonra çağrılır
    bu kod satırı sayesinde kullanıcı reklamın hepsini izle de yani kapatmasa da yeni reklam alma işlemi gerçekleşir mi?
    Teşekkürler.

    • yasirkula dedi ki:

      Banner’ı bir kere oluşturduktan sonra banner kendini belirli zaman aralıklarında otomatik olarak güncelliyor. OnAdClosed kullanıcı reklamın tamamını izleyince de çalıştırılır.

  35. Emre dedi ki:

    Build aldığımda uygulama sürekli olarak duruyor hatası alıyorum sorun androidmanifestten kaynaklı çünkü build almadan önce manifest olması gereken gibi fakat build alırken manifefstin yarısı siliniyor. nasıl çözebilirim ?

  36. Kaan dedi ki:

    Yasir bey öncelikle iyi akşamlar.Uzun zamandır uğraştığım bir projem var.Normalde bugun play store ye sürmeyi planlıyordum ama ufak bir sorunum var.Admob reklamı ekledim.Eklerken yazdıklarınızı teker teker uyguladım ama gerçek reklamlar gözükmüyor.Konuyu baya araştırdım.Play storeye koymadan admob reklam vermiyormus.Bu doğrumu yoksa benmi yanlıs biliyorum.Simdiden teşekkurler….

    • yasirkula dedi ki:

      Çocuklara yönelik reklamları aktifleştirmediyseniz, oyunu Play Store’a koymadan da reklam alırsınız; sadece reklamları oluşturduktan en azından bir gün sonra reklamları tekrar bir test edin. Eğer hâlâ reklamlar gözükmezse logcat ile aldığınız hata mesajını kontrol edin.

  37. Bayram Uğurlu dedi ki:

    hocam mesela şöyle birşey yapmak istiyorum kullanıcı leveli 3 defa kaybedince reklam çıksın bunu nasıl yapabilirim?

    • yasirkula dedi ki:

      private static int kaybetti = 0; değişkeniniz olsun. Bu durumda kullanıcı leveli kaybedince şu kodu çalıştırabilirsiniz:

      kaybetti++;
      if(kaybetti == 3)
      {
      kaybetti = 0;
      // Reklam gösterme kodunuzu buraya ekleyin
      }

      • Bayram Uğurlu dedi ki:

        hocam yani reklam gösterme kodlarınıda level kaybedilince çalışan scriptin içine mi yazayım?

      • yasirkula dedi ki:

        Direkt tüm kodu oraya yazmak yerine, reklam kodunu yazdığınız script’te reklam göstermeye yarayan public bir fonksiyon oluşturup o fonksiyonu gösterdiğim yerde çağırabilirsiniz. Örneğin eğer ReklamScript’i kullanıyorsanız, sadece ReklamScript.InterstitialGoster(); yazmanız yeterli.

      • Bayram Uğurlu dedi ki:

        hocam peki 3 tıklamada bir bu şekilde yapılabilir mi? Yani mesela kullanıcı 3 defa pause butonuna basınca reklam çıksın

      • yasirkula dedi ki:

        Evet yapılabilir, aynı mantık.

  38. Mess dedi ki:

    Merhaba, oyunumda sesi kapat diye bir özellik var. Kendi objelerimin sesini kapatabiliyorum. Ama Ses kapatıldığında video reklamlarda ses varsa, onlarda da sesin çıkmamasını istiyorum. Nasıl yapıldığı hakkında bilginiz var mıdır? Teşekkürler.

    • yasirkula dedi ki:

      Admob’un Unity plugin’inde videonun sessiz başlamasını sağlamak mümkün değil gibi duruyor. Ancak Admob’da interstitial reklam oluştururken gelişmiş ayarlarda varsayılan olarak açık olan metin, görsel ve video bazlı reklam seçeneklerinden video seçeneğini kapatmayı deneyebilirsiniz.

  39. Mustafa K. dedi ki:

    Hocam, ben admob’un implementasyonunu yaptım. Build edip telefona attım fakat bu sefer uygulama açılmıyor. [oyun ismi] durduruldu şeklinde hata veriyor. Sıkıntı ne olabilir yardımcı olursanız sevinirim.

  40. İsa dedi ki:

    Hocam merhaba, dediklerinizi harfi harfine yapıyorum ve oyunumun ilk sahnesine script’inizi atarak bir banner reklam göstermek istiyorum fakat build alıp cihazda test etmek istediğim de oyun açılır açılmaz hata verip kapatılıyor, hata mesajını incelediğimde ise şu şekilde yazıyor;

    java.lang.Error: FATAL EXCEPTION [main]
    Unity version : 2019.3.0a5
    Device model : Xiaomi MI 5s
    Device fingerprint: Xiaomi/capricorn/capricorn:8.0.0/OPR1.170623.032/V10.2.3.0.OAGMIXM:user/release-keys

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean com.google.android.gms.ads.AdSize.isFluid()’ on a null object reference
    at com.google.android.gms.internal.ads.zzyd.(Unknown Source:18)
    at com.google.android.gms.internal.ads.zzabb.zza(Unknown Source:256)
    at com.google.android.gms.internal.ads.zzabb.zza(Unknown Source:85)
    at com.google.android.gms.ads.BaseAdView.loadAd(Unknown Source:15)
    at com.google.android.gms.ads.AdView.loadAd(Unknown Source:18)
    at com.google.unity.ads.Banner$5.run(Banner.java:278)
    at android.os.Handler.handleCallback(Handler.java:793)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:173)
    at android.app.ActivityThread.main(ActivityThread.java:6698)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782

    neden böyle bir hata aldığım konusunda bana yardımcı olabilirseniz çok sevinirim.

  41. Mehmet Ali dedi ki:

    Hocam hep singletion kodunuzu kullanıyorum fakat bu sefer neden ise banner reklam çıkmıyor interstitial ve rewarded var ama banner gözükmüyor logdan bakıyorum error falan da yok

  42. Mucahit dedi ki:

    Selamun aleyküm abi ben oyunuma çocuklara yönelik reklam isteğini aktif ederek yükledim test idlerini kullanırken sorunsuz bi şekilde reklam görünüyor fakat kendi reklam idlerimi koydum herhangi bir reklam görülmüyor yaklaşık yarım saat oldu admobtan kontrol ettiğimde istekler geliyor fakat gösterim 0 nedeni nedir acaba?

    • yasirkula dedi ki:

      Ben Admob’da yeni bir uygulama oluşturduğumda reklamların gözükmesi daha uzun bir zaman almıştı. Bir gün bekleyip tekrar denemenizi öneririm (ki aradan geçen bu vakitte zaten yapmışsınızdır diye düşünüyorum).

  43. ibrahim altun dedi ki:

    hocam iyigunler geçis reklamı cok guzel calısıyor ama odullu reklam calısmıyor
    ne yapabilirim acaba

    else if (ne_geldi == “ads”) {
    ReklamScript.RewardedReklamHazirMi ();
    ReklamScript.RewardedReklamAl ();
    ReklamScript.RewardedReklamGoster( RewardedReklamGosterildi );

    }

    }
    void RewardedReklamGosterildi( GoogleMobileAds.Api.Reward odul )
    {
    can += (int) odul.Amount;
    }

    }

    • ibrahim altun dedi ki:

      yani hocam tam net yazmamısım calısmıyor derken gostermiyor yani boylelikle odullu reklam ızleyemiyorum

    • yasirkula dedi ki:

      Belki şöyle yapsanız daha iyi olur:

      else if (ne_geldi == “ads”) {
      if (ReklamScript.RewardedReklamHazirMi())
      ReklamScript.RewardedReklamGoster( RewardedReklamGosterildi );
      else
      ReklamScript.RewardedReklamAl ();
      }

      Oyunu logcat ile debug edince ney hatası alıyorsunuz? “ad failed to load: 3” ise hata sizde değil, sunucudaki reklam eksikliğindedir.

    • ibrahim altun dedi ki:

      hocam reklam acıldı cok tesekkurler 10 can veriyor onu ayarlamaya calısıcam saolun

    • ibrahim altun dedi ki:

      hocam reklam teste acılıyordu normalde acılmıyor sunucudaki reklam eksikligindenmidir acaba bide hocam kendi capımda 154 goruntuleme oldu ebgm 0 diyor daha once yaptıgım oyunlardada ebg cok dusuktu 0.30 falan hocam ebgm tabanı var onuda yapınca reklam gostermiyor sizce en verimli sekilde nasıl ayarlıyabilirim

      • yasirkula dedi ki:

        Reklamlardan ben henüz yeterince kazanamadım, size sağlıklı bir öneride bulunamam. Facebook’taki oyun geliştirici gruplarında bunu sormanızı öneririm, oralarda iyi kazanç elde eden kimseler de var. Reklamın açılmamasının sebebini anlamanın en iyi yolu logcat kullanmak, yorumumda ve derste birkaç kez bahsettim.

Cevap Yazın

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.