デジゲー博で展示する際に、Voxelorer BirdのUndoが回復されない症状が発生しました。会場では自動的にネットに接続されないため、広告やUndo回復を取得するためのサーバーアクセスに失敗していたのが原因と気付いて手元のスマホでテザリングしてみましたが、広告を見れるようにするにはアプリの再起動が必要でした。ネットに接続すればアプリを再起動しなくても広告を見れるようにする方法を調査したところ、現行のUnity Adsの動作で分かりづらいところが見つかったのでまとめておきます。
- 2021/12/27 「さらなる不具合」を追記
確認した環境
- Unity2020.3.9f1
- Unity Ads 3.7.5と4.0.0
Unity Adsの初期化失敗時の仕様と問題点
Unity Adsを利用する際には、Initialize()
を一度呼び出しておきます。呼び出し時にインターネットに接続されていなかった場合、その場では初期化は失敗しますが、ネットに接続されたら自動的に初期化が実行される仕様になっています。
この仕様はUnity2020.3.9f1のエディター上では動かないようで、初期化に失敗するとアプリを再起動する必要がありました。念のため、AndroidとiOSで試したところ、実機ではちゃんと仕様通りに再初期化することが分かりました。
Unity Ads 3.7.5ではもう一つ問題があって、初期化が失敗した後に再初期化が成功した際にOnInitializationComplete()
が呼ばれません。そのため、このコールバックを受け取る前提で作成していたVoxelore Birdはアプリの再起動が必要になったのでした。4.0.0では修正されています。
広告の初期化はLoad()を使う
Unity Ads3.x.xでは、IsReady()
で広告を表示する準備できたかどうかを確認できたのですが、4.0.0ではこのメソッドが廃止されてしまいました。Load()を手動で呼び出して、コールバックで読み込み成功を確認することになったようです。
さらなる不具合
4.0.0では、広告の初期化時にネットに接続できない状態でアプリを一時停止させてしまうと、アプリの再開後にネットに接続しても初期化は実行されず、Inittialize()を呼び出してもOnInitializationFailed()
が呼ばれて失敗するようです。
また、広告の読み込み成功後にネットから切断してShow()を呼ぶと、OnUnityAdsShowFailure()
が呼ばれて失敗します。
まとめ
まとめると以下のような感じです。
Advertisement.Initialize()
は起動時に一度呼び出せばよい- UnityAds3.7.5では、
OnInitializationComplete()
が呼ばれない可能性があるので、IsReady()
で完了を確認してからShow()
を実行 - UnityAds4.0.0では、
Load()
で必要な広告種類を手動で読み込み、OnUnityAdsAdLoaded()
が呼ばれたことを確認してからShow()
を実行
UnityAdsのマニュアルの手順に従って実装しておけば問題は回避できるということですね。Unityエディター上では再初期化がされない可能性があるので、正常に動いていないようでも実機で試すのをお忘れなく。
追記
マニュアルは勿論読んでたはずなのでおかしい・・・とこの記事を書きながら思っていたのですが、最後にマニュアルの更新日を見て納得しました。更新されたのはこの記事を書いた前日の12/17でした^^; Unity Adsの調査をしたのは数日前なので、その頃にはないドキュメントだったのですね。