カスタム イベントを作成

カスタム イベントとは、 AdMobメディエーションをご利用のパブリッシャー様が、サポート対象の広告ネットワークに含まれない第三者の広告ネットワーク向けに、ウォーターフォール メディエーションを追加できるようにする機能です。このガイドでは、Android 用と iOS 用の既存のカスタム イベントを Unity プロジェクトで使用する方法について説明します。

前提条件

  • スタートガイドの手順を完了Unity アプリに Google Mobile Ads Unity プラグインをインポートしていること。

  • カスタム イベント アダプタは、すでに Android 用と iOS 用に構築されています。カスタム イベント アダプタを作成するには、AndroidiOSに関するカスタム イベント ガイドをご覧ください。

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

カスタム イベントをメディエーションに参加させるには、ウェブ インターフェースでカスタム イベントを定義する必要があります。 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 プロジェクトにインポートするには、次のように複数の方法があります。

  • Unity 用の External Dependency Manager を使用したビルド済みの 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 ファイル内で依存関係を定義します。インポートを構成するためのルールは、Unity 用 External Dependency Manager のスタートガイドをご覧ください。次のコード スニペットには、架空の「AdPub」広告ネットワーク用の Android SDK、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 カスタム イベントがこの方法でパッケージ化されている場合は、AAR プラグインと Android ライブラリを参照して、これらのファイルを Unity プロジェクトに含める方法をご確認ください。

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

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

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

Unity は *.framework アーティファクト、*.h*.m のソースファイルをサポートしています。iOS アーティファクトとソースファイルのインポートについては、Unity のネイティブ プラグイン ガイドをご覧ください。

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

広告インスペクタを使用すると、カスタム イベントがアプリに正しくインポートされたかどうかをテストできます。広告インスペクタは、ジェスチャーのみで開くことができます。または、最小限のコードでプログラムによって開くこともできます。

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

サードパーティの広告ネットワーク SDK には、Android または iOS のメソッドを直接呼び出す必要がある特別な要件がある場合があります。これらのメソッドを直接呼び出すプロセスは次のとおりです。

  1. プラットフォーム クライアント用の共通インターフェースを定義する
  2. サポートされていないプラットフォームにデフォルトのクライアントを実装する
  3. Android メソッドを呼び出す Android クライアントを実装する
  4. iOS メソッドを呼び出すための iOS クライアントを実装する
  5. iOS クライアントと Android クライアントを条件付きで切り替えるクライアント ファクトリを実装する
  6. 第三者広告ネットワークのすべての SDK 機能にアクセスするための API を定義する

次のセクションでは、Android と iOS でメソッドを呼び出すことができる C# API の「AdPub」という架空の広告ネットワークで、この手順を実装する方法について説明します。

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() メソッドを実装します。Unity からのメソッド呼び出しを処理して AdPubSDK を呼び出すために、C メソッド GADUAdPubSetHasUserConsent() を指定して AdPubClientBridge.m を作成します。

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

正しいクライアント実装を返すファクトリ メソッドを作成する

各プラットフォーム用のクライアントの実装を作成したので、次に AdPubClientFactory クラスを作成して、ランタイム プラットフォームに応じて IAdPubClient インターフェースの正しい実装を返すようにします。このクラスは、コンパイラ ディレクティブを使用して、正しい 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);
    }
}

第三者広告ネットワークのアダプタのその他の例

iOS と Android のメソッドの呼び出しをラップする C# API を実装する第三者メディエーション アダプタの例については、Google Mobile Ads Unity プラグインの GitHub リポジトリをご覧ください。