リワード広告はパズルゲームのヒントなどの報酬を受け取ることと引き換えにユーザーが明示的に視聴することを選択できるタイプの広告です。

インタースティシャル広告との違い

インタースティシャル広告と似ていますが違いがあります。

比較 インタースティシャル リワード
広告表示 表示のタイミングはアプリ側が決定 ユーザーが希望したとき
報酬 なし ヒント・答えなど
繰り返し利用 不満につながりやすい 納得して利用しやすい

Googleも、インタースティシャル広告はゲームのステージ間など、自然な区切りでの表示を推奨しています。また、操作のたびに表示するような実装は認められないケースがあります。これに対してリワード広告は、ヒントなどの報酬を受け取ることと引き換えに、ユーザーが明示的に視聴することを選択できるので、こちらのほうが適しているといえます。

特にパズルゲームでは、広告を見ることで行き詰まりを解消できること自体が、広告を見る動機になるので広告も見られやすいです。

広告の在庫がない場合はどうなる?

広告の在庫がない場合はどうなるのでしょうか? リワード広告も必ず広告が表示されるわけではありません。

例えば、次のようなケースがあります。

広告を配信できる広告主がいない
ユーザーの地域や時間帯によって広告在庫が少ない
広告の読み込みに失敗した
通信環境が悪い
AdMob側で一時的な問題が発生している

このような原因で広告が表示されない場合があります。

GoogleのAdMobでは、広告の読み込み失敗をコールバックで検知できるので適切に切り分ける必要があります。

実装すべき処理

[ヒントを見る]ボタンが押下されるまえに広告をあらかじめ読み込んでおき、ボタンが押下されたら

広告の読み込み成功 広告を表示
広告の在庫なし 「現在広告を表示できません」と表示
通信エラー 「通信環境を確認してください」と表示

そして

広告を最後まで視聴 ヒントを表示
広告を途中で閉じる ヒントを表示しない

という処理が必要になります。

※ 広告がない場合でもゲーム自体は普通に続けられるようにしておく
※ Googleの標準的なリワード広告では、読み込んだ広告の有効期限は1時間。期限切れの広告は表示に使用できないため、新しい広告を読み込む必要がある。
※ 今回のサンプルでは、広告の読み込みに失敗したことを検知するところまで実装している。エラーの詳細な分類については、必要に応じてイベント引数から取得する。

Plugin.AdMob 3.0.2 のインストールと AndroidManifest.xml の編集

NuGet で Plugin.AdMob をインストールします。.NET 9.0 の場合は最新版をインストールすることができないので Plugin.AdMob 3.0.2 をインストールします。

そのあと AndroidManifest.xml を編集します。これは以下と同じです。

AndroidManifest.xml の編集

アプリIDをManifestに設定し忘れると、Google Mobile Ads SDKの初期化時にアプリがクラッシュすることがあります。Plugin.AdMob をインストールしたら忘れずにしておきましょう。

RewardedAdManagerクラスの定義

RewardedAdManagerクラスを定義します。プロジェクトフォルダ内に RewardedAdManager.cs を作成し、以下のコードを書きます。

Load() で広告を読み込んで Show() で表示させ、IsLoaded で読み込まれているか確認するのですが、読み込み終わったとき、閉じられたとき、最後まで表示され終わったとき、エラーが発生したときがわかるようにイベントハンドラを追加しています。

MauiProgram.cs の編集

プロジェクトフォルダ内にある MauiProgram.cs を編集します。前回までとちがって編集する部分が増えます。依存性注入機能 (DI) への登録の処理が必要です。

Home.razor の編集

Home.razor を編集します。ボタンをふたつ表示し、片方は C# 側からもうひとつは JavaScript 側からリワード広告を見るという条件でヒントを得ることができるようにします。また得られたヒントも C# 側と JavaScript 側からみることができるようにします。

広告がないときにヒントの要求があったときはどうすればよいのでしょうか?

存在しない広告は表示できないし、いつ訪れるかわからない広告を読み込める時期までヒントを見ることができないというのは不合理なので、この場合は広告なしでヒントをみせることにします。

Components\Pages\Home.razor

Home.razor.cs の作成と編集

Home.razor と同じフォルダに Home.razor.cs を作成して以下のコードを書きます。

このコードでは広告に関する処理に失敗したときに AdError が呼び出されます。広告が

AdError が呼び出される場合として考えられるのが

1. 広告の読み込みに失敗したとき
2. 広告の読み込みが完了していない状態で広告を表示させようとしたとき

です。

2. の場合はヒントを表示しますが、1. の場合はヒントを要求していないのに勝手にヒントが表示されるという問題がおきます。なので IsHintRequested フラグで両者を区別できるようにしています。

ヒントはサンプルプログラムなので「これがヒントです」と表示されるだけですが、複数回ヒントをみたときどのタイミングのヒントなのかわからないのでヒント生成時の時刻もあわせて表示させています。

広告が表示されたあとは次の広告が読み込まれるのですが、そのあいだの 2 ~ 3 秒間広告が存在しない状態になります。この状態でヒントを要求するボタンを何度も押されるとヒントのタダ食い(?)をされてしまいます。なので、ボタンを短い間隔で連打できないように、広告が表示されたら 5 秒間はヒントを要求するボタンを無効にしています。

また PC だけでデバッグしようとすると広告を読み込む処理でエラーが発生するので Android 以外では広告処理を行わないようにしています。

Components\Pages\Home.razor.cs

app.js の作成と編集

wwwrootフォルダ内に app.js を作成し、以下のコードを書きます。

wwwroot\app.js