【解決】実機でリワード/インタースティシャル広告後にクラッシュ

Unity&AdMob使用時、リワード広告&インタースティシャル広告を閉じた後に、アプリがクラッシュする問題を解決。
閉じた後の処理に、0.3秒程ディレイを入れると動作が安定した。

(StackOverflowの該当記事では、謎のプラグインを入れろとの事だったが、多めにディレイを入れるという、アホみたいな手法でも大丈夫だった)

クラッシュする理由

噛み砕くと、AdMobとUnityは別々で動いているが、「広告を閉じたリスナー」を処理する段階で、Unityの制御が完全に戻っていない、的な感じだと思う。

コード例

  • Time.timeScale = 0でポーズしていると、WaitForSecondsでは動かないので、WaitForSecondsRealtimeを使う。
  • インタースティシャル広告用の命名。中身は、リワード広告の場合も大体同じ。


//WaitForSecondsRealtimeでウェイトを入れると、timeScaleが無視される。
	static readonly WaitForSecondsRealtime HandleOnInterstitialAdClosedDelayWait = new WaitForSecondsRealtime(0.3f);
	Coroutine handleOnInterstitialAdClosedDelay;

	public void HandleOnInterstitialAdClosed(object sender, EventArgs args)
	{
//広告が中々閉じない時とかに多重実行されたら嫌なので、一応チェックしている。
		if (handleOnInterstitialAdClosedDelay != null) {
			StopCoroutine(handleOnInterstitialAdClosedDelay);
		}

		handleOnInterstitialAdClosedDelay = StartCoroutine(HandleOnInterstitialAdClosedDelay());
	}

	IEnumerator HandleOnInterstitialAdClosedDelay()
	{
		yield return HandleOnInterstitialAdClosedDelayWait;

//ディレイを入れた後に、GameManager等での再開処理(ポーズ解除や、BGMの再開等)を呼ぶ。
//		GameManager.Instance.EndInterstitialAd();


//広告の再ロードとかもしておく。


		handleOnInterstitialAdClosedDelay = null;
	}

ディレイ秒数

(自分の記憶が確かならば)
大分前にリワード広告後の演出時に同じ状態になり、1フレーム・0.1秒・0.2秒をチェックした上で弾き出した。

実機のスペックに依存しているかも。

タイトルとURLをコピーしました