カスタム イベントを作成

カスタム イベントを使用すると、 AdMobメディエーションをご利用の際に、サポート対象広告ネットワーク以外のサードパーティの広告ネットワーク向けのウォーターフォール メディエーションを追加できます。このガイドでは、Android と iOS 用に作成された既存のカスタム イベントを Unity プロジェクトで使用する方法について説明します。

前提条件

  • スタートガイドの手順を完了し、Unity アプリに Google Mobile Ads Unity プラグインをインポートしておく必要があります。

  • Android / iOS 向けのカスタム イベント アダプタがあらかじめ作成されている必要があります。カスタム イベント アダプタの作成方法については、カスタム イベントのガイド(Android /iOS)を参照してください。

カスタム イベントを定義する

カスタム イベントをメディエーションに参加させるには、 AdMob ウェブ インターフェースでカスタム イベントを定義する必要があります。Android 用と iOS 用の両方のメディエーション グループにカスタム イベントを追加しましょう。

次のスクリーンショットは、カスタム イベントの設定例を示したものです。

パラメータの入力方法
クラス名(iOS)

iOS の場合、カスタム イベントを実装するクラスの名前を入力します。

クラスを Swift で実装する場合は、クラス名の先頭にアプリやフレームワーク モジュールの名前を付ける必要があります(例: appName.className)。

プロジェクトに複数のターゲットがある場合や、プロジェクト名がターゲット名と異なる場合は、ターゲット名が必要です。ターゲット名を指定する場合、appName_targetName.className のようになります。また、英数字以外の文字(ダッシュなど)は必ずアンダースコアに置き換えてください。

クラス名(Android) Android の場合、Class Name に指定する値は、Android 用の完全修飾クラス名にする必要があります(例: com.google.ads.mediation.sample.customevent.SampleCustomEvent)。
ラベル イベントに固有の名前を入力します。
パラメータ カスタム イベントに文字列引数(たとえば広告ユニット ID)を渡す場合は指定します。

カスタム イベント ライブラリをインポートする

カスタム イベントを正常に動作させるためには、追加ライブラリのインクルードが必要なこともあります。たとえば、次のライブラリを含める必要があります。

  • Android のサードパーティ SDK
  • Android のサードパーティ カスタム イベント
  • iOS のサードパーティ広告 SDK
  • iOS のサードパーティ カスタム イベント

ライブラリの種類

Android または iOS のコードを Unity プロジェクトにインポートする方法は、以下を含め複数あります。

  • External Dependency Manager for Unity を使用して作成済みの Android または iOS アーティファクトをインポートする
  • AAR プラグインと Android ライブラリをインポートする
  • Java や Kotlin のソースファイルをインポートする
  • iOS のソースファイルと静的ライブラリをインポートする

使用するライブラリのパッケージ方法によっては、ライブラリごとに異なるインポート戦略が必要になる場合もあります。各オプションについて、後で詳しく説明します。

(推奨)作成済みの Android または iOS アーティファクトをインポートする

External Dependency Manager for Unity を使って、Maven または CocoaPods から作成済みのアーティファクトをインポートします。このプラグインは GoogleMobileAds プラグインと同梱されています。

既存のアーティファクトをインポートするには、インポート内容を定義する構成ファイルを作成します。ファイル名とパスには次の要件があります。

  • ファイルを /Editor/ フォルダ内に配置する必要があります。
  • ファイル名の末尾を Dependencies.xml にする必要があります。

たとえば、AdPub という架空の広告ネットワーク用のカスタム イベントのアダプタをインポートする場合、次のファイルを作成します。

Assets/AdPub/Editor/AdPubDependencies.xml

次に、AdPubDependencies.xml ファイル内で依存関係を定義します。インポート内容を構成する際のルールは、External Dependency Manager for Unity のスタートガイドで確認できます。以下のコード スニペットには、架空の広告ネットワーク「AdPub」用に Android と iOS の SDK とカスタム イベント ライブラリが含まれています。

Assets/AdPub/Editor/AdPubDependencies.xml

<dependencies>
  <androidPackages>
    <androidPackage spec="com.adpub.android:adpub-sdk:1.0.0" />
    <androidPackage spec="com.adpub.android:adpub-custom-event:1.0.0">
      <repositories>
        <repository>https://repo.maven.apache.org/maven2/</repository>
        <repository>https://dl.google.com/dl/android/maven2/</repository>
      </repositories>
    </androidPackage>
  </androidPackages>
  <iosPods>
    <iosPod name="AdPubSDK" version="1.0" />
    <iosPod name="AdPubCustomEvent" version="1.0">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>

カスタム イベント アーティファクトに、必要な広告ネットワーク SDK に対する依存関係があらかじめ存在する場合、SDK の依存関係を明示的に定義する必要はありません。

External Dependency Manager は、自動的に構成の変更を監視し、依存関係を解決します。また、次のメニュー コマンドによって手動で解決を実行することも可能です。

Assets > External Dependency Manager > Android Resolver > Force Resolve

AAR プラグインと Android ライブラリをインポートする

Unity は *.aar ファイルと Android ライブラリ プロジェクトのインポートにも対応しています。この方法でパッケージされている Android カスタム イベントを Unity プロジェクトに追加する手順は、AAR plug-ins and Android Libraries で確認できます。

Java や Kotlin のソースファイルをインポートする

使用する Android カスタム イベントのコードが、コンパイルされていない *.java または *.kt ファイルから成る場合、Unity 2018.2 以上であれば、Java または Kotlin のソースファイルをプラグインとして使用できます。

iOS のソースファイルと静的ライブラリをインポートする

Unity は *.framework アーティファクトと *.h および *.m のソースファイルに対応しています。iOS のアーティファクトとソースファイルをインポートする方法については、ネイティブ プラグインに関する Unity のガイドに説明があります。

カスタム イベントを広告インスペクタでテストする

広告インスペクタを使って、カスタム イベントがアプリケーションに正しくインポートされたかどうかテストすることが可能です。広告インスペクタは、ジェスチャーだけで起動するほか、最小限のコードでプログラムから起動することも可能です。

(任意)サードパーティ SDK のネイティブ メソッドを C# スクリプトから呼び出す

サードパーティの広告ネットワークの SDK には、特殊な要件により、Android または iOS のメソッドの直接呼び出しが必要なものもあります。これらのメソッドを直接呼び出す際の流れは次のとおりです。

  1. プラットフォーム クライアント用に共通インターフェースを定義する
  2. サポート外のプラットフォーム用にデフォルトのクライアントを実装する
  3. Android のメソッドを呼び出すための Android クライアントを実装する
  4. iOS のメソッドを呼び出すための iOS クライアントを実装する
  5. iOS クライアントと Android クライアントを条件に応じて切り替えるため、クライアント Factory を実装する
  6. サードパーティ広告ネットワーク SDK の機能すべてにアクセスするための API を定義する

次のセクションでは、「AdPub」という架空の広告ネットワークで上記の手順を行い、Android と iOS のメソッドを呼び出すことができる C# API を定義する方法を示します。

Android

package com.adpub.android;

public class AdPubSdk
{
    public static void setHasUserConsent(boolean hasUserConsent);
}

iOS

@interface AdPubSdk : NSObject
+ (void)setHasUserConsent:(BOOL)hasUserConsent;
@end

プラットフォーム クライアント用に共通インターフェースを定義する

基盤となる Android / iOS API を表すメソッドを含む IAdPubClient というインターフェースを作成します。

Assets/AdPub/Common/IAdPubClient.cs

namespace AdPub.Common
{
    public interface IAdPubClient
    {
        ///<summary>
        /// Sets a flag indicating if the app has user consent for advertisement.
        ///</summary>
        void SetHasUserConsent(bool hasUserConsent);
    }
}

サポート外のプラットフォーム用にデフォルトのクライアントを定義する

IAdPubClient インターフェースを実装する DefaultClient クラスを作成します。このクラス自体は、メソッド名をログするだけのものです。この実装は、Unity エディタと、Android または iOS 以外のすべてのプラットフォームで使用します。

Assets/AdPub/Common/DefaultClient.cs

namespace AdPub.Common
{
    public class DefaultClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
            Debug.Log("SetHasUserConsent was called.");
        }
    }
}

iOS プラットフォーム クライアントを実装する

iOS で IAdPubClient インターフェースを実装する iOSAdPubClient クラスを作成します。この実装は InteropServices を使用して、iOS の AdPubSdk クラスの setHasUserConsent() メソッドを呼び出します。

Assets/AdPub/Platforms/iOS/iOSAdPubClient.cs

// Wrap this class in a conditional operator to make sure it only runs on iOS.
#if UNITY_IOS

// Reference InteropServices to include the DLLImportAttribute type.
using System.Runtime.InteropServices;

using AdPub.Common;

namespace AdPub.Platforms.Android
{
    public class iOSAdPubClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
            GADUAdPubSetHasUserConsent(hasUserConsent);
        }

        [DllImport("__Internal")]
        internal static extern void GADUAdPubSetHasUserConsent(bool hasUserConsent);
    }
}
#endif

次に、上で定義した GADUAdPubSetHasUserConsent() メソッドを実装します。C メソッド GADUAdPubSetHasUserConsent() を持つ AdPubClientBridge.m を作成して、Unity からのメソッド呼び出しに対応するとともに、AdPubSDK を呼び出します。

AdPubClientBridge は iOS のソースファイルであり、ネイティブ プラグインに関する Unity のガイドにある説明のとおり、Plugins/iOS フォルダ内に配置する必要があります。

Assets/AdPub/Plugins/iOS/AdPubClientBridge.m

#import <AdPubSDK/AdPubSDK.h>

void GADUAdPubSetHasUserConsent(BOOL hasUserConsent) {
  [AdPubSDK setHasUserConsent:hasUserConsent];
}

Android プラットフォーム クライアントを実装する

Android で IAdPubClient インターフェースを実装する AndroidAdPubCient クラスを作成します。この実装は Android の Java ヘルパークラスを使用して、Android の静的メソッド setHasUserConsent() を呼び出します。

Android の Java ヘルパークラスを利用できるのは Android の実行時に限られるため、コード スニペットに示すように UNITY_ANDROID コンパイラ ディレクティブを使ってクラスをラップすることにより、コンパイル エラーを防止できます。この問題は、アセンブリ定義を使って解消することも可能です(Unity 2017.4 以降)。

Assets/AdPub/Platforms/Android/AndroidAdPubClient.cs

// Wrap this class in a conditional operator to make sure it only runs on Android.
#if UNITY_ANDROID

// Reference the UnityEngine namespace which contains the JNI Helper classes.
using UnityEngine;

using AdPub.Common;

namespace AdPub.Platforms.Android
{
    public class AndroidAdPubClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
             // Make a reference to the com.adpub.AdPubSDK.
            AndroidJavaClass adPubSdk = new AndroidJavaClass("com.adpub.AdPubSdk");

            // Call the native setHasUserConsent method of com.adpub.AdPubSDK.
            adPubSdk.CallStatic("setHasUserConsent", hasUserConsent);
        }
    }
}
#endif

適切なクライアント実装を返す Factory メソッドを作成する

これで全プラットフォームのクライアント実装が揃いました。次は、ランタイムのプラットフォームに応じて IAdPubClient インターフェースの適切な実装を返せるよう、AdPubClientFactory クラスを作成します。このクラスは、コンパイラ ディレクティブを使って適切な IAdPubClient クライアントを返します。

Assets/AdPub/Common/AdPubClientFactory.cs

namespace AdPub.Common
{
    public class AdPubClientFactory
    {
        // Return the correct platform client.
        public static IAdPubClient GetClient()
        {
#if   !UNITY_EDITOR && UNITY_ANDROID
            return new AdPub.Platforms.Android.AndroidAdPubClient();
#elif !UNITY_EDITOR && UNITY_IOS
            return new AdPub.Platforms.iOS.iOSAdPubClient();
#else
            // Returned for the Unity Editor and unsupported platforms.
            return new DefaultClient();
#endif
        }
    }
}

各インターフェース メソッド用に公開 API を定義する

IAdPubClient インターフェースの各クライアント メソッドに対応するメソッド呼び出しを持つ、AdPubApi クラスを作成します。このクラスは、AdPubClientFactory を使って IAdPubClient のインスタンスを取得し、基盤となる SDK 機能に対応してそのクライアントを呼び出します。

Assets/AdPub/AdPubApi.cs

using AdPub.Common;

namespace AdPub
{
    public class AdPubApi
    {
        private static readonly IAdPubClient client = GetAdPubClient();

        // Returns the correct client for the current runtime platform.
        private static IAdPubClient GetAdPubClient()
        {
            return AdPubClientFactory.GetClient();
        }

        // Sets the user consent using the underlying SDK functionality.
        public static void SetHasUserConsent(bool hasUserConsent)
        {
            client.SetHasUserConsent(hasUserConsent);
        }
    }
}

新たに定義した API を呼び出す

上で定義した API は、次の方法で呼び出すことができます。

Assets/Scripts/AdPubController.cs

using UnityEngine;
using AdPub;

public class AdPubController : MonoBehaviour
{
    // TODO: Get consent from the user and update this userConsent field.
    public bool userConsent;

    // Called on startup of the GameObject it's assigned to.
    public void Start()
    {
        // Pass the user consent to AdPub.
        AdPubApi.SetHasUserConsent(userConsent);
    }
}

他のサードパーティ広告ネットワーク アダプタの例

Google Mobile Ads Unity プラグインの GitHub リポジトリでは、C# API を実装して iOS / Android メソッドの呼び出しをラップするサードパーティ メディエーション アダプタのその他の例を参照できます。