カスタム イベントを作成する

プラットフォームを選択: Android 新規 Android iOS Unity

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

前提条件

続行する前に、次のことを行ってください。

  • を設定しますGoogle Mobile Ads Unity Plugin。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 プロジェクトにインポートする方法は、以下を含め複数あります。

  • 作成済みの Android または iOS アーティファクトを External Dependency Manager for Unity によってインポートする
  • 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's のガイドに説明があります。

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

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

(任意)サードパーティ 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() メソッドを実装します。AdPubClientBridge.m を作成して、C メソッド GADUAdPubSetHasUserConsent() を使用して Unity からのメソッド呼び出しに対応するとともに、 AdPubSDK を呼び出します。

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

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 メソッドの呼び出しをラップするサードパーティ メディエーション アダプタのその他の例を参照できます。