UnityでAdMobのリワード広告を使う

2019/01/23:超修正

2019/02/21:さらに修正

リワード、バナー、全画面。

いつも使うので、出来るだけ使いやすいようにしてみました。

シングルトンにしてスクリプトから呼び出しやすくしたつもりです。

他にも色々やり方あると思いますが。

前提

  • UniRx(フリーアセット)をインポート(リワード広告の実装に必要でした)
  • AdMobSdkをインポート
  • unity2018.3.2f

パッケージにしました。 以下のファイルをダウンロードしてUnityのエディター内で「Asset」➡「ImportPackage」➡「CustomPackage」とかからインポートできるはずです。

ユニティパッケージ


使用方法

  1. Adsフォルダ内に「AdManager」プレハブがあります。それをシーン内に設置します。
  2. 同フォルダ内に広告のIDを入れたデータがあるのでインスペクタからIDをセットします。
  3. AdManager.Instance.[Banner,Interstitial,Reward].Show()をそれぞれに呼び出して表示できます。
  4. コード補完でそれっぽいメソッドが呼び出せると思います。

UIのボタンとかから呼び出すには、上記3のメソッドを呼び出す処理を別に書く必要があります。

広告の種類での実装の違い

Banner

Show()とHide()で見せたり隠したりできます。表示するポジションとサイズはスクリプト内で変更する必要があります。インスペクタから変更したかったんですが、ちょっと詰まったので止めました。

Intersitital

InterstitialShow()とIntersititalFadeOutshow(float time_s)で表示されるはず。

Reward

実装しないといけないメソッドをabstractで宣言してます。RewardAd.csでメソッドの処理を実装するだけです。VisualStudioだったらabstractメソッドを実装するようにコード補完機能が使えるので楽です。

  • RewardGet:報酬を獲得するとき
  • RewardFailed:動画を最後まで見ないで報酬を獲得できないとき
  • GameRestart:動画が閉じられてアプリが再開するとき
  • AppBackGround:動画からリンクに飛んだなど、アプリがバックグランドに移行したとき

上記4つのイベントハンドラを実装します。


リワード広告が手間だった……

リワード広告は報酬を獲得する処理を設定する必要がありますが、コールバック内でゲームオブジェクトを参照するとエラーになりますので、UniRxを使ってメインスレッド上で実行するようにしています。

色々回り道した気がします。ほかの人はどうやって実装しているんだろう?

でも割かし簡単にできるようになったんじゃないかなって思ってます。


余談とコメント

リワード広告を使うときには見終わった後の報酬に関する処理が必要になりますが、呼び出すコールバックをAwakeで入れてます。ですけど、コールバック内で直接Unityのゲームオブジェクトにアクセスすると[main thread ~~]エラーになります。

この問題を何とかしたくて最初はコールバック内でフラグを立てるだけにしてUpdate()内で処理をするようにしてたんですが、なんかスッキリしない……。

色々調べて、UniRxにたどり着き、スレッドをメインスレッドに移して実行するのが一番よさそうだったのでこうなりました。


テスト広告が表示されれば自分のIDの広告も表示されるはずです。もちろん、IDが間違ってたらダメですが。本番用のIDだと広告を読み込むまでに時間がかかったりするみたいです。しばらくしたら、なんか表示されると思います。1日、二日かかったりもする? 詳細はGoogleのみぞ知る。


バナーとインタースティシャルは実装がそんなに複雑じゃなかったんですけど、リワードだけで相当時間とられた……。


UniRxの使い方を少し知れたのは良かったですけど。


ビルドが中々上手くいかなかったのも加わって、2日くらいとられた気がする……。

でもこれから実装が楽になりそうだからよかったと思おう。

良ければ使ってみてください。自分の環境ではなんとか動きました。

広告の読み込みに失敗したときの処理も必要な気がしてきた。

広告の読み込みに失敗したら時間をおいて再度読むように。ただロードできなかったらずっとロードに挑戦しつづけてます。

リワードのコールバックは全部UniRxでいれてみました。