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秒をチェックした上で弾き出した。
実機のスペックに依存しているかも。