カスタム イベントを使用すると、 AdMobメディエーションをご利用の際に、サポート対象広告ネットワーク以外のサードパーティの広告ネットワーク向けのウォーターフォール メディエーションを追加できます。このガイドでは、Android と iOS 用に作成された既存のカスタム イベントを Unity プロジェクトで使用する方法について説明します。
前提条件
スタートガイドの手順を完了し、Unity アプリに Google Mobile Ads Unity プラグインをインポートしておく必要があります。
Android / iOS 向けのカスタム イベント アダプタがあらかじめ作成されている必要があります。カスタム イベント アダプタの作成方法については、カスタム イベントのガイド(Android /iOS)を参照してください。
カスタム イベントを定義する
カスタム イベントをメディエーションに参加させるには、 AdMob ウェブ インターフェースでカスタム イベントを定義する必要があります。Android 用と iOS 用の両方のメディエーション グループにカスタム イベントを追加しましょう。
次のスクリーンショットは、カスタム イベントの設定例を示したものです。
パラメータの入力方法 | |
---|---|
クラス名(iOS) |
iOS の場合、カスタム イベントを実装するクラスの名前を入力します。 クラスを Swift で実装する場合は、クラス名の先頭にアプリやフレームワーク モジュールの名前を付ける必要があります(例: プロジェクトに複数のターゲットがある場合や、プロジェクト名がターゲット名と異なる場合は、ターゲット名が必要です。ターゲット名を指定する場合、 |
クラス名(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 のメソッドの直接呼び出しが必要なものもあります。これらのメソッドを直接呼び出す際の流れは次のとおりです。
- プラットフォーム クライアント用に共通インターフェースを定義する
- サポート外のプラットフォーム用にデフォルトのクライアントを実装する
- Android のメソッドを呼び出すための Android クライアントを実装する
- iOS のメソッドを呼び出すための iOS クライアントを実装する
- iOS クライアントと Android クライアントを条件に応じて切り替えるため、クライアント Factory を実装する
- サードパーティ広告ネットワーク 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 メソッドの呼び出しをラップするサードパーティ メディエーション アダプタのその他の例を参照できます。