4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GameMaker StudioAdvent Calendar 2020

Day 15

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

Last updated at Posted at 2020-12-14

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

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

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

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

1. Admobアカウントの作成

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

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

2. Admobのサイトで広告ユニットを追加する

表示したい広告ユニットを追加します。広告の種類としては、以下の3つが利用できます。

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

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

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

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

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

Google_Play_Services_by_YoYo_Games___GameMaker__Marketplace.png

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

Escape002_-GameMaker_Studio_2.png

この一覧の "Google Play Services" にある「下向きの矢印」をクリックすることでダウンロードできます。
Escape002_-GameMaker_Studio_2.png

ダウンロードできたら、左隣の丸で囲んだ矢印をクリックして、プロジェクトにインポートします。
Escape002_-GameMaker_Studio_2.png

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

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

Escape002_-GameMaker_Studio_2.png

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

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

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

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

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

// 広告の初期化.
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イベントには以下のように記述します

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イベントです。

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

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

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

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] イベントを作成します。

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

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

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

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

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

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

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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?