【Unity】 i-mobile Ad Network で広告を表示する(実装)

Android

今回はUnityアプリ上で i-mobile Ad Network の広告配信サービスを利用して広告を表示するための実装について説明します。以前の記事でi-mobile Ad Networkのアカウント作成からSDKのダウンロードまでの実装準備についてまとめておりますので、こちらも合わせてご覧ください。




開発環境

  • Unity 2019.4.18f1
  • Xcode 12.4
  • imobile_for_SP_app_Unity_Plugin_2.0.13
  • imobile_for_SP_app_iOS_SDK_2.1.0
  • Android 10
  • iOS 14.4

SDKセットアップ手順

Android iOS共通セットアップ

まずはUnityプロジェクトを起動してAssets→Import Package→Custom PackageからSDKをインポートします。

SDKのパッケージをインポート

既存のAssetsにImportしようとすると以下のようなWarningが表示されることがあります。

i-mobile Ad Network パッケージ

File exists in project but with different GUID.というWarningです。パッケージに含まれるフォルダのメタデータに書かれているGUIとプロジェクトのものが異なる場合に表示されます。

これを無視すると環境やパッケージによってはビルドエラーや動作不良が出てしまう場合があります。

私の環境ではそのままImportしましたが、もし問題があった場合は一度Warningが発生したファイルを削除して、Importした後に再度前のファイルを戻すといった処置をしてみてください。

Androidセットアップ

imobileSdkAds.jarをコピーは不要

公式のマニュアルにはimobileSdkAds.jarをコピーする手順が記載されていましたが、今はパッケージに含まれているため不要です。

AndroidManifestの設定

AndroidManifest.xmlですが、パッケージに含まれるファイルではまともに動きません。Unityが生成するAndroidManifest.xmlをベースに書き換えて使用することをお勧めします。

まずPlayer Settings→Other Settings→Internet AccessをRequireに設定します。

Player Settings

この設定でビルドし、Unityが吐き出したAndroidManifest.xmlは以下に格納されています。

PROJECT_PATH\Temp\gradleOut\unityLibrary\src\main\AndroidManifest.xml

このファイルをUnity EditorのAssets/Plugins/Androidにコピーして、このManifestを使用するように Player Settings→Publishing Settings→Build→Custom Main Manifestにチェックを入れます。

AndroidManifestの設定

最後にAssets/Plugins/AndroidにあるManifestに以下の3点を追加、変更します。

  • <application android:usesCleartextTraffic=”true”>
  • <uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />
  • <meta-data android:name=”com.google.android.gms.version” android:value=”@integer/google_play_services_version” />

AndroidManifest.xmlのサンプルは以下になります。

<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools">
	<application android:usesCleartextTraffic="true">
		<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="false">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
      <meta-data android:name="android.notch_support" android:value="true" />
    </activity>
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    <meta-data android:name="unity.splash-mode" android:value="0" />
    <meta-data android:name="unity.splash-enable" android:value="True" />
    <meta-data android:name="notch.config" android:value="portrait|landscape" />
    <meta-data android:name="unity.build-id" android:value="c6113a23-aa06-40a2-8cf2-9ec4c773b767" />
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
  </application>
  <uses-feature android:glEsVersion="0x00030000" />
  <uses-feature android:name="android.hardware.vulkan.version" android:required="false" />
  <uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

特に<application android:usesCleartextTraffic=”true”>がないと正しく広告が読み込めず、以下のように[error] NETWORK というエラーになります。

こちらマニュアルにも記載がないので注意が必要です。

Google Play Serviceのインストール

Google Play Serviceのインストールについて公式ではAndroid SDK環境で説明していますが、いまいち何をしていいのやらよくわかりません。

UnityにはGoogle Play Service APIを必要なところだけ解決してくれるパッケージがあり、Admobパッケージをインストールすることで自動的に適用されるのでそれを利用しました。Admobはこちらから。

こちらからパッケージを落としてきてImportします。またこの時、imoblileのパッケージに最初から含まれているPlugins/Android/google-play-service.jarファイルが残っているとビルドエラーになるので必ず削除してください

iOSセットアップ

iOSは各種FrameWorkをリンクするだけです。以下のFrameWorkをAsssets/Plugins/iOSにコピーします。

  • ImobileSdkAds.framework(こちらからダウンロード)
  • AdSupport.framework
  • SystemConfiguraion.framework
  • CoreLocation.framework
  • WebKit.framework
  • StoreKit.framework

ImobileSdkAds.frameworkはこちらからダウンロードします。そのたFrameWorkは以下Xcodeパッケージ内にあります。

Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks

実装方法

実装は公式にあるサンプルほぼそのままです。適当なGameObjectに以下のスクリプトをアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AdNetWorkManager : MonoBehaviour
{
    public string IMOBILE_BANNER_PID = "ZZZZZZ";
    public string IMOBILE_BANNER_MID = "YYYYYYY";
    public string IMOBILE_BANNER_SID = "XXXXXX";

    private void Awake()
    {
#if UNITY_IPHONE || UNITY_ANDROID && !UNITY_EDITOR
//            IMobileSdkAdsUnityPlugin.setTestMode(true);
            // スポット情報を設定します
            IMobileSdkAdsUnityPlugin.registerInline(IMOBILE_BANNER_PID, IMOBILE_BANNER_MID, IMOBILE_BANNER_SID);
            // 広告の取得を開始します
            IMobileSdkAdsUnityPlugin.start(IMOBILE_BANNER_SID);
#endif
    }
    // Start is called before the first frame update
    void Start()
    {
#if UNITY_IPHONE || UNITY_ANDROID && !UNITY_EDITOR
            // 広告の表示位置を指定して表示します(画面中央下)
            IMobileSdkAdsUnityPlugin.show(IMOBILE_BANNER_SID,
                IMobileSdkAdsUnityPlugin.AdType.BANNER,
                IMobileSdkAdsUnityPlugin.AdAlignPosition.CENTER,
                IMobileSdkAdsUnityPlugin.AdValignPosition.BOTTOM);
#endif
    }

    // Update is called once per frame
    void Update()
    {

    }
}

IMOBILE_BANNER_PIDなどID設定はpublicにすることでUnityEditorから入力できるようにしました。また、広告の開始はStart()でやっています。

IMobileSdkAdsUnityPlugin.setTestMode(true)は指定することでテストモードで広告を表示できます。エラーの情報や状態が広告欄に表示されるので便利です。

デバイスでの動作確認

Android、iOS共に無事広告が表示されました。

広告表示イメージ

テストモードの他にテスト用の広告IDというのがあります。

テスト用のIDはクリックすると広告には飛ばないので、開発中はこちらを使用することをお勧めします。ID一覧はこちらにまとまっています。

おわりに

やはりAndroidでの表示に苦労しました。Manifestやらパッケージやらアップデートの度に何かと毎度つまづくのがAndroidです。

コメント

  1. […] 【Unity】 i-mobile Ad Network で広告を表示する(実装)今回はUnityアプリ上で i-… […]