【GameMaker Studio2】Admobの組み込み方法

ゲーム内広告を実装するためのモジュール Admob の組み込み方法を解説します

Admobを組み込む手順は大まかなに以下の流れとなります。

1. Admobアカウントの作成
2. Admobのサイトで広告ユニットを追加する
3. 拡張機能 "Google Play Services" をプロジェクトに追加する
4. 広告ユニットの種類に対応する処理を組み込む
5. 広告を再生するタイミングで広告開始処理を呼び出し、広告が終了したらゲームに戻る

なお、公式の記事で組み込み手順をまとめていますので、ほとんどの情報はこちらにまとまっています。

* [iOS and Android: Google Mobile Ads Setup](https://help.yoyogames.com/hc/en-us/articles/360002971751-iOS-and-Android-Google-Mobile-Ads-Setup)

# 1. Admobアカウントの作成
Admobアカウントは、Googleアカウントを持っていれば、以下のリンクからすぐに作成できます。
https://admob.google.com/home/

注意点としては、Google AdSense にすでに登録済みのアカウントは登録できないようです。その場合は、Admob用のアカウントを作成する必要があります。

# 2. Admobのサイトで広告ユニットを追加する
表示したい広告ユニットを追加します。広告の種類としては、以下の３つが利用できます。

1. **バナー**：ゲーム画面の一部に常時表示する広告。画面の下部に表示すると良い。誤クリックしがちな場所に置くと不正なアプリとして BANされるらしいので注意
2. **インタースティシャル**：全画面に表示される広告。ステージクリア時など、ゲームの区切りで表示する
3. **リワード**：動画を視聴することでゲーム内報酬が得られる広告。広告を見ることでアイテムがもらえたり、クレジットが増えるなど

こちらの注意点ですが、広告ユニットを作成するとそれに対応する「広告ID」はすぐに得られますが、広告を実際に表示するには、1日ほどの審査が必要になるようです。

# 3. 拡張機能 "Google Play Services" をプロジェクトに追加する

Admobアカウントを登録して、広告ユニットを作成したら、ようやくプロジェクトへの組み込みができます。

拡張機能 "Google Play Services" はMarketplaceで入手できます。

* [Google Play Services by YoYo Games](https://marketplace.yoyogames.com/assets/2008/google-play-services)

![Google_Play_Services_by_YoYo_Games___GameMaker__Marketplace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/404c76c6-3785-bc9f-add7-83831d789f06.png)

このサイトににログイン後、購入処理（無料）を済ませると、GameMaker側のメニュー「Marketplace > My Library」を選択することで、一覧に表示されるようになります。

![Escape002_-_GameMaker_Studio_2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/2cce78b1-fde0-5910-4c34-b23ba10df246.png)

この一覧の "Google Play Services" にある「下向きの矢印」をクリックすることでダウンロードできます。
![Escape002_-_GameMaker_Studio_2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/f06a2506-b131-4804-00c8-8d4dd2b5965b.png)

ダウンロードできたら、左隣の丸で囲んだ矢印をクリックして、プロジェクトにインポートします。
![Escape002_-_GameMaker_Studio_2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/040a63d4-9e32-ce5b-8f58-a872a2f6cce9.png)

インポート画面が表示されるので、以下の手順でプロジェクトに追加します。

1. Extensions > GooglePlayAdsExtension をクリック
2. Addボタンをクリック
3. Resources to import に追加される
4. importボタンをクリックして、プロジェクトに追加する

![Escape002_-_GameMaker_Studio_2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/51b9aa2e-f0a9-17f8-60bf-78277dc5b636.png)

これで、Asset Browser に拡張機能が追加されます。

# 4. 広告ユニットの種類に対応する処理を組み込む

組み込み方法は、広告ユニットの種類ごとに処理が異なるのですが、ここでは「インタースティシャル」のみ紹介します。
なお、広告ユニットは「バナー」「インタースティシャル」「リワード」すべてを使うようにしたほうが広告収入が上がるようです。

## アプリケーション起動時の処理

まずはアプリケーション起動時に一度だけ行う処理です。

```js
// 広告の初期化.
switch(os_type) {
case os_android:
  // アプリケーションID
  var app_id = "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX";
  // インタースティシャルID
  var interstitial_id = "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX";
  // 初期化
  GoogleMobileAds_Init(interstitial_id, app_id);

  // ※テスト用端末の登録
  GoogleMobileAds_UseTestAds(true, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

  // 広告の読み込み
  GoogleMobileAds_LoadInterstitial();
  break;
}
```

`GoogleMobileAds_Init()` で初期化するには、広告ユニット作成時に取得した、アプリケーションIDとインタースティシャルIDを指定します。
次に、`GoogleMobileAds_UseTestAds()` で動作テスト時に広告を不正利用したと思われないように、テスト用端末を登録します。
ここで指定する端末IDは、広告を実際に動かしたときに出力されるログからコピーします。

最後に`GoogleMobileAds_LoadInterstitial()`で広告を読み込みます。

## 広告再生用のオブジェクトを作成する

広告再生用のオブジェクトを作成します。"obj_ads" という名前などが良いかもしれません。
Createイベントには以下のように記述します

```js:Createイベント
/// @description initialised the AdMob extension.

// ロード済みかどうか
interstitial_loaded = false;
// 表示済みかどうか
interstitial_showed = false;

// 1秒間反応しなかったら広告処理を強制終了する.
alarm[0] = 60;

if(GoogleMobileAds_InterstitialStatus() == "Ready") {
  // ロード済み.
  interstitial_loaded = true;
}
else {
  // 広告読み込み開始.
  GoogleMobileAds_LoadInterstitial();
}
```

`GoogleMobileAds_InterstitialStatus()` で広告を読み込み済みかどうかを判定できます。もしこの戻り値が "Ready" でなかった場合は、読み込み処理を行います。

あと、何らかの理由で広告を表示できなくなった場合でも、進行不能が発生しないように 1秒間経過後にタイムアウトするようにします。この値は好みで決めてよいと思います。

次に、Stepイベントです。

```js:Stepイベント
if(interstitial_loaded) {
  // ロード済み.
  if(interstitial_showed == false) {
    // まだ表示していない → 広告表示を開始.
    GoogleMobileAds_ShowInterstitial();
    interstitial_showed = true;
    alarm[0] = -1; // タイムアウト処理を取り消す
  }
}
```

ロード済みで、広告が表示されていなれば、`GoogleMobileAds_ShowInterstitial()` を呼び出して広告表示を開始しています。

これで広告表示ができるようになったので、広告が閉じられたかどうかを判定します。
表示状態を判定するには、非同期イベントを使用します。
Asynchronous > Async - Social イベントを追加します。

```js:Async-Socialイベント
var _id = async_load[? "id"];
if(_id == GoogleMobileAds_ASyncEvent) {
  // 広告イベントが発生.
  var ident = async_load[? "type"];
  switch(ident) {
  case "interstitial_load":
    // 広告読み込み開始
    if(async_load[? "loaded"] == 1) {
      interstitial_loaded = true;
      if(interstitial_showed == false) {
        // 広告表示開始.
        interstitial_showed = true;
        GoogleMobileAds_ShowInterstitial();
        alarm[0] = -1; // タイムアウト処理を取り消す
      }
    }
    else {
      // 広告を表示できなかったので終了.
      instance_destroy();
    }
    break;
		
  case "interstitial_closed":
    // 広告表示が終了した
    GoogleMobileAds_LoadInterstitial();
    instance_destroy();
    break;
  }
}

```

まず、`async_load[? "id"]` が "GoogleMobileAds_ASyncEvent" であるかどうかを判定します。
次に、`async_load[? "type"]` が "interstitial_load" であれば読み込み開始、"interstitial_closed" であれば表示終了となります。

最後にタイムアウト判定です。Alarm[0] イベントを作成します。

```js:Alarm[0]
/// @description time out.
// 一定時間経過で自動破棄.
instance_destroy();
```

これで広告表示用オブジェクトは作成完了です！

# 5. 広告を再生するタイミングで広告開始処理を呼び出し、広告が終了したらゲームに戻る

あとは、広告を呼び出すタイミングで、広告オブジェクトを生成し……

```js
// 広告オブジェクトを作成.
execObj = instance_create_depth(0, 0, 0, obj_Ads);
```

Stepイベントなどで終了待ちをして、終了したら次の場面に移動するといった記述をします

```js
if(instance_exists(execObj) == false) {
  // 広告終了.
  execObj = noone;
  // 以下、次の処理に進む処理を書く.
  // ...
}

```