【雑記】GameMakerでAdMobを設定するメモ (2022.10)

GameMakerでAdMobを設定するメモです。

なお、Androidの出力設定については以下のページに書きましたので、その続きとなります。

【雑記】GameMakerからAndroidへの出力を行うメモ (2022.10) 【雑記】GameMakerからAndroidへの出力を行うメモ (2022.10)

GameMakerでAdMobを設定するメモ

AdMob公式サイトで広告ユニットを作成する

このあたりは色々な方が書かれているのでそのあたりを参考に…。以下はUnity環境ですが、AdMobの広告ユニット作成部分は同じなので、私はここを参考に作りました。

広告ユニットの種類と使い方

広告ユニットには3種類ありますが、概ね以下の用途となります。

  • バナー:常に表示する広告。課金などで消えるようにするオプションをつけても良いのかも
  • インタースティシャル:全画面広告。ステージクリア時などゲームの区切りに出すのが良さそう
  • リワード:見ることでユーザーが報酬を得られるもの。スタミナ回復や消費アイテム獲得など

Google AdMob Extension をインストールする

すでに記事にされている方がいらっしゃるのでこちらを参考にしました。

Marketplaceで購入 (無料) する

以下のサイトから Google AdMob Extrension を購入 (無料) します。

「Add to Account (Free)」ボタンをクリックします。

そうすると、ライセンス認証画面が表示されるので「I have read and agree to the EULA」をクリックして同意します。

そうすると「Download for Studio 2.3」となって利用可能となります。(※ここではダウンロードしません

Google AdMobをインストール

AdMobを利用したい GameMaker のプロジェクトを開いて、メニューから「Marketplace > My Library」を選びます。

ライブラリ管理画面が表示されるので、検索欄に「Google」と入力して、「Google AdMob」があるのを確認し、ダウンロードボタンをクリックします。もし表示されない場合は更新ボタンを押すと表示されるようになるかもしれません。

ダウンロードできたら、インポートボタンをクリックしてインポートを行います。

ちなみに先程の解説記事に書かれている通り、古いエクステンション (Google Play Services Extension) が存在すると、ビルド対象に含まれてしまってエラーとなってしまうので、古いものは削除する必要があります。

インポート画面では必要なモジュールをインポートします。最低限必要なのは「AdMob > Extensions > AdMob」ですが「AdMob Demo > Objects > Obj_AdMob」も入れておくとかなり楽に広告を表示できます。

追加手順としては以下のとおりです。

  1. Package Resources から使いたいモジュールを選択
  2. “Add” ボタンを押して、インポート対象に含める
  3. “Import” ボタンを押してプロジェクト内に追加する

アプリIDの設定

設定画面を表示するにはアセットブラウザから「AdMob > Extensions > AdMob」をダブルクリックします。

そうすると AdMob の設定画面が表示されるので、下にスクロールして各種項目 (Extension Options) を入力します。

  • Application ID: アプリID
  • Banner Unit ID: バナーユニットID
  • Interstitial Unit ID: インタースティシャルユニットID
  • Rewarded Unit ID: リワードユニットID
  • Rewarded Instastitial Unit ID: ???

最後が謎ですがそれぞれ入力していきます。

ちなみに アプリIDは、アプリ設定から見つかります。

それぞれの広告ユニットは「広告ユニット」から見つかります。

広告処理の呼び出し

基本的に AdMob_Demo に含まれる “obj_AdMob” さんがすべてやってくれます。

例えばテストデバイスの判定は “AdMob_SetTestDeviceId()” の呼び出しが行われると自動で設定してくれるようです。

// ###############################################
//                  CONFIGURATION
// ###############################################

// Sets this device as a test device (should be called before AdMob_Initialize)
// NOTE: This is for development only and should not be used when your game enters production.
// ** On iOS devices to use test device you need to include the App Tracking Transparency extension. **
AdMob_SetTestDeviceId();

そのため、製品版ではこの関数の呼び出しを無効化する必要がありそうです。

また各広告ユニットの初期化も自動でやってくれそうです。

// This function is an helper function used for loading all ads
function loadAllAds() {
	//インタースティシャルしか使わない.	
	AdMob_Interstitial_Load();
	//AdMob_RewardedVideo_Load();
	//AdMob_RewardedInterstitial_Load();
}

ただ私はインタースティシャル広告しか使わないので、AdMob_RewardedVideo_Load() / AdMob_RewardedInterstitial_Load() は無効化しておきました。

ゲーム中にはずっと存在させたいので、Obj_AdMob に「Persistent」設定をしておきます。

そうしたらゲーム開始画面などで生成しておきます。

// initial ads.
switch(os_type) {
case os_android:

	// Obj_AdMob を生成.
	instance_create_depth(0, 0, 0, Obj_AdMob);
	break;
}

実行して動作確認

Obj_AdMobを実行すると何らかの表示をしてくれるみたいなので、ひとまずビルドしてみます。ですが、何やらエラーが表示されます。

エラーメッセージ
* What went wrong:
Execution failed for task ':jp.jp_2dgames.escape002:processDebugMainManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [com.google.android.gms:play-services-ads:21.2.0] /Users/syun77/.gradle/caches/transforms-3/5af82bd74c8f640123f6fecb3ae34505/transformed/jetified-play-services-ads-21.2.0/AndroidManifest.xml as the library might be using APIs not available in 16
  	Suggestion: use a compatible library with a minSdk of at most 16,
  		or increase this project's minSdk version to at least 19,
  		or use tools:overrideLibrary="com.google.android.gms.ads.impl" to force usage (may lead to runtime failures)

Google翻訳すると以下の通り。

エラーメッセージ
* 何が悪かったのか:
タスク「:jp.jp_2dgames.escape002:processDebugMainManifest」の実行に失敗しました。
> マニフェストのマージに失敗しました: uses-sdk:minSdkVersion 16 は、ライブラリで宣言されたバージョン 19 より小さくすることはできません [com.google.android.gms:play-services-ads:21.2.0] /Users/syun77/.gradle/caches/transforms -3/5af82bd74c8f640123f6fecb3ae34505/transformed/jetified-play-services-ads-21.2.0/AndroidManifest.xml (ライブラリが 16 で利用できない API を使用している可能性があるため)
   提案: minSdk が最大 16 の互換性のあるライブラリを使用してください。
   または、このプロジェクトの minSdk バージョンを少なくとも 19 に増やします。
   または tools:overrideLibrary="com.google.android.gms.ads.impl" を使用して使用を強制します (実行時にエラーが発生する可能性があります)

API Level の設定周りでエラーが発生しているような予感…?

公式ドキュメントを見ると、 Minimum SDK API Level を「16」に設定するとのこと。

Once that’s done you will also need to ensure that the Minimum SDK API Level is set to at least 16 in the Android Game Options, as that is the minimum required API level for the AdMob SDK to build, while the Target and Compile should be on the latest:

それが完了したら、Android Game Options で最小 SDK API レベルが少なくとも 16 に設定されていることを確認する必要があります。これは、AdMob SDK をビルドするために最低限必要な API レベルであり、Target と Compile がオンになっている必要があります。 最新の:

iOS and Android: Google Mobile Ads (AdMob) Setup

そう考えて設定を確認してみたものの、 Minimum SDK API Level は「16」となっている…?

再びエラーコードを読み直すと、何やら「19」より小さくできないみたいな記述が。

エラーコード抜粋
> マニフェストのマージに失敗しました: uses-sdk:minSdkVersion 16 は、ライブラリで宣言されたバージョン 19 より小さくすることはできません [com.google.android.gms:play-services-ads:21.2.0] /Users/syun77/.gradle/caches/transforms 

そこで「19」にしてみたところ…。

無事ビルドできました。

ちなみにインタースティシャル広告の表示は以下の処理で簡単にできます。ゲームの処理を完全にブロックして完了待ちしなくても良いので、かなり楽に実装できますね…!

if(AdMob_Interstitial_IsLoaded()) {
  // 読み込みができていたら表示.
  AdMob_Interstitial_Show();
}

ただ、AdMobのロードが完了していない状態で、AdMob_Interstitial_Show() を呼び出すとゲームがクラッシュしますので、そのあたりは注意が必要そうです。