🐸

[GMS2]AdMobの設定方法

6 min read

GameMaker Studio2でモバイルゲーム向けなどにAdMobを設定する方法をメモしておきます。

既存の記事としては、国内でGMS2関連の記事を多く執筆していらっしゃる@2dgames_jpさんが書かれた詳細な解説記事があるのですが、2021年8月にYoYoから新しいExtensionがリリースされたので、本記事はそのExtensionを使用する最新の導入方法を解説するものです。
ちなみに@2dgames_jpさんの記事は本当に参考になるものばかりで、私もGMSを使い始めたばかりの頃(今でもですが)、何度も読ませていただきました。本当にありがとうございます。

本記事ではAdMob自体の広告IDの作成方法などは含みません。

導入の流れ

  • MarketplaceでGoogle AdMob extensionを購入(無料)
  • My Libraryから上記Extensionを読み込む
  • AdMobのアプリIDと各広告ユニットのIDを設定する
  • Room内にObj_AdMobを設置する

新しいGoogle AdMob Extension


こちらより購入する

GMS2内のMy Libraryから必要ファイルを読み込む


他のExtensionと読み込み方法は同じですが、上部メニューのMarketplace > My Libraryから、先程購入したGoogle AdMobを読み込みます。

上記画像の上にあるものが新しいExtensionです。下のものは、以前までAdMobの表示に必要だった古いExtensionです。

私の環境だけの問題かもしれませんが、古いGoogle Play services Extensionと、新しいGoogle AdMob Extensionが共存している状態だと、Androidで最終的にゲームをリリースする際に必要な、「aabファイルの書き出し」が正常にできませんでした。
ルーム内に古いobjファイルを設置していなくても、アセットツリー内に古いExtensionが存在しているだけでダメでした。ですので、古いExtensionは削除しました。


Extension内の全てのアセットを読み込みます。デモ用のroomやボタンなどのファイルも含んでいるので、全てを読み込む必要はないのですが、中身を見ると表示や非表示の制御の参考にもなるので、最初はとりあえずファイル全部をざっと一読するとよいのかなと思います。

必要最小限のファイルは、以下の2つのみです。

  • Extensions > Admob
  • Objects > Obj_AdMob

詳細なマニュアルについてはInclude Files内のdatafilesフォルダに、pdfのものとdocxのものが入っています。コードなどがまるでハイライトされていないのでかなり読みにくいですが…

AdMobのアプリIDと各広告ユニットのIDを設定する

Extension内でアプリIDを設定する

まず最初にアプリIDを設定します。

Extensionsフォルダ内のAdMobというファイルをダブルクリックすると、上記のような設定画面が出てくるので、iOS、Androidそれぞれの設定画面の中の、赤くハイライトした部分の文字列を、自分のアプリIDに置き換えます。ca-app-pub-で始まる文字列です。

Obj_AdMob内で広告ユニットのIDを設定する

次に、Obj_Admobを開きます。
Createイベント内に、以下のような記述があるので、それぞれの変数のなかのIDを、自分のアプリの広告ユニットIDに置き換えます。

var BANNER_ID, INTERSTITIAL_ID, REWANTED_ID;
if(os_type == os_android)
{
	BANNER_ID = "ca-app-pub-XXXXXXXXXXXXXXXXXXXXXXXXXX";
	INTERSTITIAL_ID = "ca-app-pub-XXXXXXXXXXXXXXXXXXXXXXXXXX";
	REWANTED_ID = "ca-app-pub-XXXXXXXXXXXXXXXXXXXXXXXXXX";	
}
else if(os_type == os_ios)
{
	BANNER_ID = "ca-app-pub-XXXXXXXXXXXXXXXXXXXXXXXXXX";
	INTERSTITIAL_ID = "ca-app-pub-XXXXXXXXXXXXXXXXXXXXXXXXXX";
	REWANTED_ID = "ca-app-pub-XXXXXXXXXXXXXXXXXXXXXXXXXX";	
}

まだ広告ユニットIDを作成していない場合は、以下のデモ用広告ユニットIDを使用すると良いです。
iOS用
Android用

Android用のデモ用広告ユニットIDを使用すると、なぜかAndroid向けのコンパイルが通らず、エラーになってしまうようになりました。GameMakerStudio2のIDEが2.3.4以降の問題、、、?
すみません検証ができていませんが、本番用の広告ユニットIDならば問題なく通りました。テストデバイスの設定さえされていれば、動作確認時に本番用のユニットIDを使用していても問題ないはずです。

Room内にObj_AdMobを設置する

最初のroomに、Obj_AdMobを設置して、表示準備は完了です。

デフォルトのObj_AdMobでは、Asyncイベント内にバナー広告を画面下部に表示させるような処理が最初から入っています。AdMob_Banner_Create(banner_type,true)

インターステイシャル広告とリワード広告に関しては、読み込み処理だけ最初から書いてあるので、あとは、任意のタイミングで(たとえばゲームが次のステージに行く際などに)AdMob_Interstitial_Show()関数を使用すると、インターステイシャル広告を表示させることができます。

Asyncイベント

// We do an early exit if the 'async_load' map doesn't contain a "type" key.
if(!ds_map_exists(async_load, "type"))
	exit;

show_debug_message("AdMob: " + json_encode(async_load));

// We switch on the type of the event being fired
switch(async_load[?"type"])
{

	// AdMob_Initialize finished
	case "AdMob_OnInitialized":
		// At this point the AdMob API succeeded to initialize.
		// We use this event to load both the interstitial/rewarded video ads.
		// インターステイシャル広告と、リワード動画広告のイニシャライズをします。(読み込むだけで、表示はしない。任意のタイミングでAdMob_Interstitial_Show()関数を使って表示。)
		AdMob_Interstitial_Load();
		AdMob_RewardedVideo_Load();
		
		//Load banner ad
		// バナー広告の種類をコメントアウトして選択できるようになっています。デフォルトではアダプティブバナーになっています。
		// var banner_type = AdMob_Banner_NORMAL;
		// var banner_type = AdMob_Banner_SMART;
		// var banner_type = AdMob_Banner_FULL;
		// var banner_type = AdMob_Banner_LARGE;
		// var banner_type = AdMob_Banner_MEDIUM;
		// var banner_type = AdMob_Banner_LEADERBOARD;
		 var banner_type = AdMob_Banner_ADAPTIVE;
		var bottom = true;
		//AdMob_Banner_Create(banner_type,bottom)でバナー広告を表示。
		AdMob_Banner_Create(banner_type,bottom);		
		break;
	
	// AdMob_Banner_Create succeeded
	case "AdMob_Banner_OnLoaded": 
		// At this point the banner ad succeeded to be created.
		//バナー広告の読み込みが終了したときの処理を追記できます。
		break;
	
	// AdMob_Banner_Create failed
	case "AdMob_Banner_OnLoadFailed":
		// At this point the banner ad failed to be created.
		//バナー広告の読み込みが失敗したときの処理を追記できます。
		break;
	
	// AdMob_Interstitial_Load succeeded
	case "AdMob_Interstitial_OnLoaded":
		// At this point the interstitial ad succeeded to load.
		//インターステイシャル広告の読み込みが終了したときの処理を追記できます。
		break;
	
	// AdMob_Interstitial_Load failed
	case "AdMob_Interstitial_OnLoadFailed":
		// At this point the interstitial ad failed to load.
		//AdMob_Interstitial_load() // This can create an infinite loop if load always fails!!
		//インターステイシャル広告の読み込みが失敗したときの処理を追記できます。ここに、AdMob_Interstitial_load()を追記して、失敗したらすぐに再読み込みが入るようにしてしまうと、何らかの事情でずっと広告が読み込めない際に、無限ループに入ってしまうので危険です。
		break;
	
	// 割愛しますが、以下もインターステイシャル広告とリワード広告の処理の分岐を記述できるような、switchのcase分岐が並んでいます。
	
	
}

おわりに

AdMob広告を表示するだけならば上記のやりかたでOKです。

ちなみにこのExtension内には、EU向けにアプリをリリースする際に必要なGDPRの承認を得るためのObj_Admob_Consentも入っているので、EU向けにアプリをリリースする際にはそちらの対応も必要です。(また別の記事で導入方法を書きたいと思います)

更に、iOSデバイス用には、iOS14以降で必須になったAppTrackingTransparency(ATT)への対応も必要ですが、こちらもYoYo謹製のプラグインが用意されています。

私はこのような対応をしてアプリをリリースしたのですが、なぜかリリース直後に、ダウンロード数が殆ど無いにも関わらず、どこかから謎の数百の広告リクエストが送られてしまって、AdMobのAIに不正な水増しクリックを疑われたらしく、即刻広告配信が停止になってしまいました…。
数日たった今も制限かかったままで、しばらく様子を見ています…。

Discussion

ログインするとコメントできます