iOS/Android(Unity5.5)で Admobメディエーションで、バナー広告、インタースティシャル広告、動画リワード広告を、最適化した色んな会社の広告をシングルトンで一元化して出す方法

## タイトル通り、admobメディエーション下記形式で出す際に使っているソースを忘れないようにメモ

* バナー広告（320x50のフッターバナー等）
* インタースティシャル広告（リザルト画面等にいった際に全画面表示されるインタースティシャル広告）
* 動画リワード広告(動画を視聴させて、ゲーム内インセンティブを払ったりする動画側の広告)

導入にあたっては、admobSDK+admobのUnityプラグインと、
各SDKネットワークのSDKが必要なります。
（nendなら、NendSDK(iOS)用＋NendUnityプラグイン+Nendのadmob用アダプターが、ネットワーク毎に必要だったり、、汗）


> 試した環境
Unity5.4 mac
Unity5.5 mac


## admobメディエーションを各Unityのシーンから呼び出せるようにsingletonにしたC#ソース

> 下記、動画リワードは、Applovin、AdColonyを配信するようにしています。


```GameSceneSingleton.cs


public class GameSceneSingleton {

	private static GameSceneSingleton mInstance;

	private GameSceneSingleton () { // Private Constructor

	}

	public static GameSceneSingleton Instance {
		get {
			if( mInstance == null ) mInstance = new GameSceneSingleton();
			return mInstance;
		}
	}



	/**********
	 *  admob インタースティシャルメディエーション用シングルトン
	 **********/

	private InterstitialAd interstitial;
	private AdRequest request;

	private BannerView bannerView;

	bool is_close_interstitial = false;

	// バナーリクエスト
	public void RequestBanner()
	{
		#if UNITY_ANDROID
		string adUnitId = Constant.SDK_ADMOB_BANNER_UNIT_ID;
		#elif UNITY_IPHONE
		string adUnitId = Constant.SDK_ADMOB_BANNER_UNIT_ID;
		#else
		string adUnitId = Constant.SDK_ADMOB_BANNER_UNIT_ID;
		#endif


//		AdSize adSize = new AdSize(50, 320); //縦長カスタマイズしたら
// 		Create a 320x50 banner at the top of the screen.
//		bannerView = new BannerView(adUnitId, adSize, AdPosition.Bottom);

		bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.BottomRight);


		// テストデバイス指定
		AdRequest request = new AdRequest.Builder()
			.AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
			.AddTestDevice("*************")  // My test device
			.Build();

		// Load the banner with the request.
		bannerView.LoadAd(request);

		bannerView.Hide (); //最初は一旦非表示
	}

	// バナー非表示
	public void BannerHide(){
		if (bannerView != null) {
			bannerView.Hide ();
		}
	}

	// バナー非表示
	public void BannerShow(){
		if (bannerView != null)
		{
			bannerView.Show ();
		}
	}


	// インスティリクエスト
	public void RequestInterstitial()
	{
		#if UNITY_ANDROID
		string adUnitId = Constant.SDK_ADMOB_INSTI_UNIT_ID;
		#elif UNITY_IPHONE
		string adUnitId = Constant.SDK_ADMOB_INSTI_UNIT_ID;
		#else
		string adUnitId = Constant.SDK_ADMOB_INSTI_UNIT_ID;
		#endif

		if (is_close_interstitial == true) {
			interstitial.Destroy ();
		}

		// Initialize an InterstitialAd.
		interstitial = new InterstitialAd (adUnitId);

		// Create an empty ad request.
		//		request = new AdRequest.Builder ().Build ();


		// テストデバイス指定
		AdRequest request = new AdRequest.Builder()
			.AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
			.AddTestDevice("***************")  // My test device
			.Build();

		// Load the interstitial with the request.
		interstitial.LoadAd (request);

		interstitial.OnAdClosed += HandleAdClosed;
		//		interstitial.AdClosed += HandleAdClosed;

		is_close_interstitial = false;
	}

	// インタースティシャル広告を閉じた時に走る
	void HandleAdClosed (object sender, System.EventArgs e)
	{
		is_close_interstitial = true;
	}

	// インタースティシャル非表示
	public void InterstitialDestroy(){
		if (is_close_interstitial == true) {
			interstitial.Destroy ();
		}
		RequestInterstitial ();
	}

	// インタースティシャル表示用
	public void InterstitialShow(){
		if (interstitial.IsLoaded ()) {
			interstitial.Show ();
		}
	}




	// admob 動画リワードメディエーション用シングルトン
	private RewardBasedVideoAd rewardBasedVideo;

	public void RequestRewardBasedVideo()
	{

		// 各SDKの初期化
//		AppLovin.SetVerboseLoggingOn("true");

		#if UNITY_ANDROID

		// AppLovin
		AppLovin.InitializeSdk();
		// Preload a rewarded video after you initialize.
		AppLovin.LoadRewardedInterstitial();

		// AdColony
//		AdColony.Configure ("version:1.0,store:google", Constant.SDK_ADC_APP_ID, Constant.SDK_ADC_ZONE_ID);

		#elif UNITY_IOS

		// AppLovin動画リワードSDK
		AppLovin.SetSdkKey(Constant.SDK_APPLOVIN_API_KEY);
		AppLovin.InitializeSdk();

		// AdColonySDK
		AdColony.Configure("1.0", Constant.SDK_ADC_APP_ID, Constant.SDK_ADC_ZONE_ID);

		#endif


		string adUnitId;
		#if UNITY_EDITOR
		adUnitId = "unused";
		#elif UNITY_ANDROID
		adUnitId = Constant.SDK_ADMOB_VIDEO_REWARD_AD_UNIT_ID;
		#elif UNITY_IOS
		adUnitId = Constant.SDK_ADMOB_VIDEO_REWARD_AD_UNIT_ID;
		#else
		adUnitId = "unexpected_platform";
		#endif


		rewardBasedVideo = RewardBasedVideoAd.Instance;

		// テストデバイス指定
		AdRequest request = new AdRequest.Builder()
		.AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
		.AddTestDevice("**************")  // My test device
		.Build();


		rewardBasedVideo.LoadAd(request, adUnitId);

		// has rewarded the user.
		rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;
		rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoRewardedClosed;
		rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoRewardedFailed;

	}

	public GameManager gameSceneControlls;
	public void setVideoSdkCallbackListener(GameManager controller)
	{
		gameSceneControlls = controller;
	}



	// 動画再生
	public void pushAds()
	{

		#if UNITY_EDITOR
		#elif UNITY_ANDROID


		if (rewardBasedVideo.IsLoaded()) //admob動画リワードメディエーションが読み込み完了なら
		{
			rewardBasedVideo.Show();
		}

		#elif UNITY_IOS

		if (rewardBasedVideo.IsLoaded()) //admob動画リワードメディエーションが読み込み完了なら
		{
			rewardBasedVideo.Show();
		}

		#else
		#endif
	}

	// 読み込み可能かチェック
	public bool madiationIsLoaded()
	{


		#if UNITY_EDITOR
		return true;
		#elif UNITY_ANDROID

		return rewardBasedVideo.IsLoaded();

		#elif UNITY_IOS
		return rewardBasedVideo.IsLoaded();
		#else
		return false;
		#endif

	}

	// 報酬受け渡し処理
	void HandleRewardBasedVideoRewarded(object sender, Reward args)
	{

	}

	// 動画広告リロード
	void HandleRewardBasedVideoRewardedClosed(object sender, System.EventArgs args)
	{
		RequestRewardBasedVideo();

		if (gameSceneControlls)
		{
			// 指定の視聴完了コールバックメソッド呼び出し。
			gameSceneControlls.mediationVideoFinishedCallBack();
		}

	}

	// ロード失敗時
	void HandleRewardBasedVideoRewardedFailed(object sender, AdFailedToLoadEventArgs args)
	{
		// ここ要確認、無線状態になると永遠にadmobにリクエスト送りまくるので扱い注意
		RequestRewardBasedVideo();
	}

}

```

* 各SDK毎にAPI情報など定数は個々に宣言してください。
* 動画視聴完了のコールバックを受けとるリスナーも記載しています。
* admobのテストデバイスを必ず登録しておいて方がいいです。（誤タップアカバン対策）


### 呼び出し処理関連

#### ゲーム起動時の初期化部分

```GameManager.cs

// 〜〜省略

		// admob インスティメディエーションの準備
		GameSceneSingleton.Instance.RequestInterstitial ();

		// admob バナーメディエーション準備
		GameSceneSingleton.Instance.RequestBanner ();

		// admob 動画リワードメディエーション準備
		GameSceneSingleton.Instance.RequestRewardBasedVideo();

// 〜〜省略

```

#### 再生可能かのチェックと、動画再生

```GameManager.cs

// 〜〜省略

	if(GameSceneSingleton.Instance.madiationIsLoaded()){

		Sound.StopBgm ();	 		//BGMストップ
		videoCallBackFlg = false; 	//コールバック済みフラグをリセット

		/// 動画リワード
		GameSceneSingleton.Instance.pushAds();


	}else{

		videoCallBackFlg = false; //コールバック済みフラグをリセット
		VideoFinishedCallBack();

	}

// 〜〜省略

```

### 視聴完了のリスナー登録

```GameManager.cs

// 〜〜省略

	GameSceneSingleton.Instance.setVideoSdkCallbackListener(this);

// 〜〜省略

```