Unity + Admob を使っていて Android 実機環境で終了処理を行うコールバック関数が動かない

目次

問題点

Unity で Admob を使っていて、Androidリワード動画広告を再生後、各種コールバック関数が呼び出されない。

前提知識

Admob の Unity 向けプラグインRewardBasedVideoAd というクラスには主に以下のコールバック関数がある

OnAdRewarded リワード広告再生が成功して報酬を受け取り処理を行うときに呼び出される。
OnAdClosed 広告再生後、クローズボタンを押したときに呼び出される。

しかし、Android 実機環境で動画広告の再生はされるが、広告を閉じたあと、これらのコールバック関数が呼び出されない不具合が発生した。


原因

今回の原因は大きく2つあった。

1. コールバック関数内で Debug.Log が動いていなかった

まずコールバック関数が呼び出されたどうかの確認を Unity の標準ログ Debug.Log を使っていたが、コールバック内ではうまく動かないらしい。
github.com

なぜそうなのかは分からないが、ともかく別の手段(UI の色を変えるなど)でコールバック関数が発火されていることは確認した。
しかし、それでもその後の処理がうまくいかなかった。

2. Admob 動画広告再生後、AudioSource.Play で例外が発生していた
adb Logcat でログを確認すると AudioSource.Play 関数を呼び出していたところで例外が発生していた。
詳しくは分からないが、Unity がスレッドセーフでない関係で、Admob 動画広告を再生したあと、すぐに AudioSource.Play を呼び出すとこけるらしい。

以下のリンクが参考になった。
groups.google.com

解決策

コールバック関数内でオーディオを含む終了処理は StartCoroutine を使って少し間を開けて実行する。

// 広告が閉じられたときに呼び出されるコールバック関数
private void onAdClosed(object _sender, System.EventArgs _args) {
    StartCoroutine(_onEnd());
}

private IEnumerator _onEnd() {
    yield return new WaitForSeconds(1f);
    // オーディオを鳴らすなどの終了処理をここに書く
}

これで上手く再生後の処理が行われた。