ツテなしフリーランス日誌

ツテが全く無いまま会社を辞め、我が道を行くフリーランスエンジニアのブログです



Xcode コーディング中にビルドが走る原因と停止方法

Xcode コーディング中にビルドが走る原因と停止方法

現象

Storyboardを使用しコーディングをしていると、コードを編集するたびにビルドが走ってしまい、動作が重くなることがあります。

原因

その原因は@IBDesignableを使用し、StoryboardにViewの内容を反映しているためです。(@IBDesignableを使用していない場合は、原因は別にありますので、他の方法を探してください。。)

カスタムで設定した値を見た目で即座に確認できる@IBDesignableはとても便利なのですが、毎回コードを編集するたびにビルドが走ってしまうと、PCが重くなってしかたないです。

解決

Storyboard編集エディタを表示し、メニューバーのEditor > Automatically Refresh Views のチェックを外します。

f:id:kurisankaku:20171118095206p:plain

これにより、コーディング中に自動的にビルドが走るのを止められます。

Storyborad上の表示を更新する際は、Refresh All Viewsを実行するか、Storyboard上での編集時のみAutomatically Refresh Viewsのチェックをつけるなどしてください。

Android AAR形式ライブラリ作成

Androidのライブラリモジュール(AAR)を作成する手順をサンプルを交えて説明します。 AARはJARと異なり、Androidリソースやマニフェストファイルを含めることができます。

今回は、サンプルとして動画ランダムに再生される動画広告ライブラリのようなものを作ります。

Android プロジェクトの新規作成

Android Projectを新しく作成します。

Android ライブラリモジュールの作成

1. メニューのFile > New > New Module を選択します。

f:id:kurisankaku:20170702170836p:plain

2. Create New Module 画面のAndroid Libraryを選択し、Nextを押します。

f:id:kurisankaku:20170702170917p:plain

3. Application/Library nameModule nameを入力し、Finishを押します。

f:id:kurisankaku:20170702170932p:plain

4. モジュールが新しくプロジェクトに追加されます。

f:id:kurisankaku:20170702170944p:plain

コードの記述

必要なコードを記述してください。今回は、RewardVideoAd#show()を実行すると、ダイアログが表示され動画が再生されるというモジュールを作成しました。

下記コードを試す場合は、videoUrlに動画のURLを入力してください。

  • RewardVideoAd.java
package com.example.test.moviead;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.LinearLayout;
import android.widget.VideoView;

import java.util.Calendar;

public class RewardVideoAd {

    private VideoAdListener videoAdListener;
    private Dialog dialog;
    private VideoView videoView;
    /**
     * 動画URL。
     */
    private static final String[] videoUrl = {
            "ここにhttpから始まる動画のURLを入力してください。"
    };

    /**
     * コンストラクタ
     */
    public RewardVideoAd(Activity activity) {
        initDialog(activity);
    }

    /**
     * VideoAdListenerを設定する
     */
    public void setVideoAdLisener(VideoAdListener listener) {
        this.videoAdListener = listener;
    }

    /**
     * 動画を再生する
     */
    public void show() {
        dialog.show();
    }

    /**
     * Dialogの初期化
     *
     * @param context コンテキスト
     */
    private void initDialog(Context context) {
        dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        if (dialog.getWindow() != null) {
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);

        }
        initVideoView(dialog.getContext());
        dialog.setContentView(videoView);
        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                // VideoViewの特性上、Viewが表示されてからロードが始まるため、
                // Dialogが表示されてからロードを始めることとする。
                videoView.setVideoURI(Uri.parse(videoUrl[(int) (Math.random() * videoUrl.length)]));
            }
        });
    }

    private void initVideoView(Context context) {
        videoView = new VideoView(context);
        videoView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                videoView.start();
                if (videoAdListener != null) {
                    // リスナーを呼び出す
                    videoAdListener.rewardVideoAdDidStartPlaying(new VideoRewardData("start video", Calendar.getInstance().getTimeInMillis()));
                }
            }
        });
        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (videoAdListener != null) {
                    // リスナーを呼び出す
                    videoAdListener.didRewardUserWithReward(new VideoRewardData("end video", Calendar.getInstance().getTimeInMillis()));
                }
                dialog.dismiss();
            }
        });
    }
}
  • VideoAdListener.java
package com.example.test.moviead;

public interface VideoAdListener {
    void rewardVideoAdDidStartPlaying(VideoRewardData data);
    void didRewardUserWithReward(VideoRewardData data);
}
  • VideoRewardData.java
package com.example.test.moviead;

public class VideoRewardData {
    public VideoRewardData(String name, long time) {
        this.name = name;
        this.time = time;
    }
    public String name;
    public long time;
}

AARの作成

1. メニューのBuild > Make Project を選択します。

2.ビルドが成功すると、プロジェクトのbuildディレクトリのoputputsaarファイルが作成されます。例えば、今回のサンプルプロジェクトであれば、AndroidAarSample > movieadd > build > outputs > aar に作成されます。

AARの使用

1.使用したいプロジェクトを開き、メニューのFile > New > New Module を選択します。(今回は、UseAarExampleという新しいプロジェクトを作成しました。)

f:id:kurisankaku:20170702171000p:plain

2. Create New Module 画面のImport .JAR/.AAR Packageを選択し、Nextを押します。

f:id:kurisankaku:20170702171010p:plain

3.先程作成したaarファイルをを選択し、Finishを押します。

f:id:kurisankaku:20170702171024p:plain

4.aarを使用するプロジェクトを右クリックし、Open Module Settings を選択します。

f:id:kurisankaku:20170702171033p:plain

5.Dependenciesタブのリストの下にあるボタンをクリックし、Module dependencyを選択します。

f:id:kurisankaku:20170702171047p:plain

6.関連付けるModuleを選択し、OKを押します。

f:id:kurisankaku:20170702171058p:plain

7.取り込んだModuleを使用して、アプリケーションを作成してください。下記サンプルコードでは、ボタンを作成して、ボタンを押したら動画が流れるようにしました。

package com.example.aar.use.kurisankaku.xyz.useaarexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.example.test.moviead.RewardVideoAd;
import com.example.test.moviead.VideoAdListener;
import com.example.test.moviead.VideoRewardData;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RewardVideoAd rewardVideoAd = new RewardVideoAd(this);

        findViewById(R.id.show_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                rewardVideoAd.show();
            }
        });
        rewardVideoAd.setVideoAdLisener(new VideoAdListener() {
            @Override
            public void rewardVideoAdDidStartPlaying(VideoRewardData data) {
                Log.i("tag",data.name + " start!!!!!!!!!!!!!!!!!!!!");
            }

            @Override
            public void didRewardUserWithReward(VideoRewardData data) {
                Log.i("tag",data.name + " end!!!!!!!!!!!!!!!!!!!!");
            }
        });
    }
}
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.aar.use.kurisankaku.xyz.useaarexample.MainActivity">

    <Button
        android:id="@+id/show_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show" />

</android.support.constraint.ConstraintLayout>
  • AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.aar.use.kurisankaku.xyz.useaarexample">

    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

サンプルコードと合わせて試してみてください。

【Unity】ScrollViewにログテキストを表示して、自動スクロール

ログの内容が実行画面でも見たいと思い、ScrollViewにログを表示し、自動でスクロールされるようにしました。

1. ScrollViewの作成

Hierarchyビューの Create -> UI -> Scroll View を選択してください。

f:id:kurisankaku:20170322212723p:plain

2. ContentにTextとContent Size Filterの追加

ScrollView -> Viewport -> Contentに

  • 文字を表示するために、Textを追加します。
  • 文字が増えるごとにコンテンツサイズを増やすために、Content Size Filter を追加し、可変にします。
    • Holizontal Fit -> Unconstrained
    • Vertical Fit -> PrefferedSize

f:id:kurisankaku:20170322213647p:plain

f:id:kurisankaku:20170322212924p:plain

3. ScrollViewのスクリプトを作成

AssetsフォルダにScrollView用のスクリプトを作成してください。ここでは、ManageScroll.csというスクリプトを作成するとします。

作成したら下記コードを記載してください。

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class ManageScroll : MonoBehaviour {

    // ScrollViewに表示するログ
    public static string Logs = "";
    // ログの差分を取得するための入れ物
    private string oldLogs = "";
    // ScrollViewのScrollRect
    private ScrollRect scrollRect;
    // ScrollViewのText
    private Text textLog;

    // Start時に各オブジェクトを取得
    void Start ()
    {
        scrollRect = this.gameObject.GetComponent<ScrollRect>();
        textLog = scrollRect.content.GetComponentInChildren<Text>();
    }

    void Update ()
    {
        // logsとoldLogsが異なるときにTextを更新
        if (scrollRect != null && Logs != oldLogs) {
            textLog.text = Logs;
            // Textが追加されたときに5フレーム後に自動でScrollViewのBottomに移動するようにする。
            StartCoroutine(DelayMethod(5, () =>
                {
                    scrollRect.verticalNormalizedPosition = 0;
                }));
            oldLogs = Logs;
        }   
    }

    //ログを表示
    public static void Log(string logText)
    {
        Logs += (logText + "\n");
        Debug.Log(logText);
    }

    // 指定したフレーム数後にActionが実行される
    private IEnumerator DelayMethod(int delayFrameCount, Action action)
    {
        for (var i = 0; i < delayFrameCount; i++)
        {
            yield return null;
        }
        action();
    }
}

4. ScrollViewにスクリプトを追加

作成したスクリプトをScrollViewに追加してください。

f:id:kurisankaku:20170322212949p:plain

5. ログを追加

作成したScrollViewにログを追加します。この例では、Buttonを押すごとに下記動作を行わせます。

  • デバッグログに時刻表示
  • ScrollViewのTextに時刻表示

Buttonオブジェクトの追加をし、Button用のスクリプトを作成します。

下記のように、ScrollViewに作成したスクリプトをOnClick時に使用するようにします。

using UnityEngine;
using System;

public class Button1 : MonoBehaviour {
    public void onClickButton1()
    {
        ManageScroll.Log(DateTime.Now.ToString ("tthh時mm分ss秒fffミリ秒"));
    }
}

ButtonのOnClickイベント操作などは、下記記事を参照してください。

www.kurisankaku.xyz

6. 実行

実行し、動作を確認してください。ボタンを押すたびに時刻が表示され、スクロールされます。

f:id:kurisankaku:20170322213009p:plain

【Unity】Buttonをクリックして、ButtonのTextを変える

簡単な動作確認をするのに Button はとても便利です。Android, iOSでもそのまま動作します。

ButtonのOnClickイベントを検知して、文字を変える方法を紹介します。

1. Buttonオブジェクトの作成

1. HierarchyビューのCreate -> UI -> Buttonを選択します。

f:id:kurisankaku:20170321231333p:plain

2. Canvasが作成されていない場合は、CanvasとButtonが作成されます。

f:id:kurisankaku:20170321231354p:plain

3. AndroidiOSで見たときにも見栄えが変わらないように、CanvasのUI Scale Modeを変更します。

  • UI Scale Mode -> Scale With Screen Size

f:id:kurisankaku:20170321231506p:plain

4. Buttonがこのままでは見難いので、位置と大きさを調整します。

  • Pos X -> 0, Pos Y -> 0
  • Width -> 300, Height -> 100

f:id:kurisankaku:20170321231518p:plain

5. TextのFont Sizeも調整します。

  • Font Size -> 40

f:id:kurisankaku:20170321231533p:plain

2. スクリプトの作成

1. ProjectビューのAssetsフォルダ上で右クリックし、Create -> C# Scriptを選択し、スクリプトを作成します。名前はなんでも構いません。

f:id:kurisankaku:20170321231554p:plain

f:id:kurisankaku:20170321231630p:plain

2. スクリプトを開き、下記コードを挿入してください。

public void OnClickButton()
{
    // Textコンポーネント郡を取得します。
    var components = this.gameObject.GetComponentsInChildren<Text>();
    // テキストを文字の状態によって変更するようにします。
    components[0].text = components[0].text == "Button" ? "Changed" : "Button";
}

3. Buttonにスクリプトを追加

1. ButtonのInspectorを開き、Buttonにコンポーネントとして、先程作ったスクリプトドラッグアンドドロップして追加します。

f:id:kurisankaku:20170321231834p:plain

2. On Clickの+ボタンを押します。

f:id:kurisankaku:20170321231850p:plain

3. None(Object)のボタンを押し、Buttonオブジェクトを選択します。

f:id:kurisankaku:20170321232003p:plain

f:id:kurisankaku:20170321232101p:plain

4. No Functionとなっているところを押し、作成したスクリプトのメソッドを選択します。

f:id:kurisankaku:20170321232130p:plain

4. 実行

実行し、ボタンを押して文字が変わることを確認してください。

f:id:kurisankaku:20170321232142p:plain

f:id:kurisankaku:20170321232153p:plain

【Unity】AdMobのメディエーションにUnity Adsを組み込み、動画広告再生。

前回は、UnityにAdMobを組み込み、バナーを表示する方法を紹介しました。

www.kurisankaku.xyz

今回は、AdMobのメディエーションとして「Unity Ads」を組み込む手順を紹介します。

1. Unity Ads のプロジェクト作成

Unity Adsのダッシュボード よりプロジェクトを作成してください。

ここで作成したプロジェクトに登録されている「アプリID」は、後で使用します。

f:id:kurisankaku:20170320183127p:plain

2. AdMobで新しい広告ユニットの作成

1. AdMob の対象のアプリの収益化ページを開いてください。「新しい広告ユニット」のボタンを押します。

2. 動画リワードを選択し、広告ユニット名を入力、「保存」を押してください。

f:id:kurisankaku:20170320182446p:plain

3. 設定手順を表示では、「完了」を押します。

4. メディエーションのリンクを押します。(下の画像例では、「1個の広告ソース」)

f:id:kurisankaku:20170320182743p:plain

5. 「新しい広告ネットワーク」を押します。

f:id:kurisankaku:20170320182759p:plain

6. 「利用可能な広告ネットワーク」から「Unity Ads(報酬型)」を選択し、必要項目を入力し、「続行」を押します。

  • Game ID ・・・ Unity Adsの「アプリID」を入力してください。
  • Placement ID ・・・ 「広告枠ID」を入力してください。
  • 広告ネットワーク最適化はチェックを外しても構いません。

【AdMob画面】 f:id:kurisankaku:20170320182821p:plain

【UnityAds画面】 f:id:kurisankaku:20170320183127p:plain

f:id:kurisankaku:20170320182939p:plain

7. 新しい広告ネットワークが作成されました。「保存」を押します。

f:id:kurisankaku:20170320183359p:plain

3. Unityのスクリプト作成

AdMobを組み込むUnityプロジェクトを開きます。新しいスクリプトを作成し、下記 3−1〜3 のコードを設定してください。

AdMobのプラグインは、既にUnityプロジェクトへインポート済みとします。プラグインのインポート方法については、こちらを参照してください。

www.kurisankaku.xyz

それぞれのAPIの詳細は、公式ドキュメントを参照してください。

3-1. 動画リワード広告のロード

adUnitIdには、AdMobの「広告ユニットID」を入力してください。

private void RequestRewardBasedVideo()
{
    #if UNITY_ANDROID
    string adUnitId = "INSERT_AD_UNIT_HERE";
    #elif UNITY_IPHONE
    string adUnitId = "INSERT_AD_UNIT_HERE";
    #else
     string adUnitId = "unexpected_platform";
    #endif

    RewardBasedVideoAd rewardBasedVideo = RewardBasedVideoAd.Instance;

    AdRequest request = new AdRequest.Builder().Build();
    rewardBasedVideo.LoadAd(request, adUnitId);
}

3-2. イベントハンドラの登録

動画のロード完了、開始、終了などのイベントをハンドリングするためのコードです。

private void RegistHandler() {
    RewardBasedVideoAd rewardBasedVideo = RewardBasedVideoAd.Instance;
    // Ad event fired when the rewarded video ad
    // has been received.
    rewardBasedVideo.OnAdLoaded += HandleRewardBasedVideoLoaded;
    // has failed to load.
    rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoFailedToLoad;
    // is opened.
    rewardBasedVideo.OnAdOpening += HandleRewardBasedVideoOpened;
    // has started playing.
    rewardBasedVideo.OnAdStarted += HandleRewardBasedVideoStarted;
    // has rewarded the user.
    rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;
    // is closed.
    rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoClosed;
    // is leaving the application.
    rewardBasedVideo.OnAdLeavingApplication += HandleRewardBasedVideoLeftApplication;
}

#region RewardBasedVideo callback handlers

private void HandleRewardBasedVideoLoaded (object sender, EventArgs args)
{
    MonoBehaviour.print ("HandleRewardBasedVideoLoaded event received");
}

private void HandleRewardBasedVideoFailedToLoad (object sender, AdFailedToLoadEventArgs args)
{
    MonoBehaviour.print (
        "HandleRewardBasedVideoFailedToLoad event received with message: " + args.Message);
}

private void HandleRewardBasedVideoOpened (object sender, EventArgs args)
{
    MonoBehaviour.print ("HandleRewardBasedVideoOpened event received");
}

private void HandleRewardBasedVideoStarted (object sender, EventArgs args)
{
    MonoBehaviour.print ("HandleRewardBasedVideoStarted event received");
}

public void HandleRewardBasedVideoClosed (object sender, EventArgs args)
{
    MonoBehaviour.print ("HandleRewardBasedVideoClosed event received");
}

private void HandleRewardBasedVideoRewarded (object sender, Reward args)
{
    string type = args.Type;
    double amount = args.Amount;
    MonoBehaviour.print (
        "HandleRewardBasedVideoRewarded event received for " + amount.ToString () + " " + type);
}

private void HandleRewardBasedVideoLeftApplication (object sender, EventArgs args)
{
    MonoBehaviour.print ("HandleRewardBasedVideoLeftApplication event received");
}
#endregion

3-3. 動画の再生

3-1, 3-2のメソッドを使用して、動画を再生する例です。通常は何らかのアクションがあった場合に動画を再生するようにしてください。

// Use this for initialization
void Start ()
{
    RegistHandler ();
    RequestRewardBasedVideo ();
}

bool isShowed = false;
void Update ()
{
    RewardBasedVideoAd rewardBasedVideo = RewardBasedVideoAd.Instance;
    if (rewardBasedVideo.IsLoaded () && !isShowed) {
        rewardBasedVideo.Show ();
        isShowed = true;
    }
}

4 ビルド

Android, iOS別でのビルド方法を説明します。

4-1. Android

1. SDKのダウンロード

1. 下記公式の Mediation Networks 一覧のページを開いてください。

f:id:kurisankaku:20170320183443p:plain

2. Unity Adsの「Compatiable SDK」の「Download Android」のページを開きます。

3. Releasesから最新の「unity-ads.aar」をダウンロードしてください。

f:id:kurisankaku:20170320183556p:plain

2. アダプタのダウンロード

1. 下記公式の Mediation Networks 一覧のページを開いてください。

2. Unity Adsの「Adapter」の「Download Android」のページを開きます。

3. Filesタブを開き、最新の「unity-X.X.X.X.aar」をダウンロードしてください。

f:id:kurisankaku:20170320183612p:plain

3. SDKとアダプタの組み込み、ビルド

1. Unityのプロジェクトの Assets -> Plugins -> Android フォルダ直下にダウンロードしてきた「unity-ads.aar」と「unity-X.X.X.X.aar」を入れてください。

2. メニューバーのFile -> Build Settings を開き、Androidにプラットフォームを設定し、「Build And Run」を実行してください。実機もしくはエミュレータをつなげている場合は、アプリが実行され動画が再生されます。

4-2. iOS

1. GoogleMobileAds.frameworkのダウンロード

googlemobileadssdkios.zip をダウンロードし展開、「GoogleMobileAds.framework」があることを確認してください。

2. SDKのダウンロード

1. 下記公式の Mediation Networks 一覧のページを開いてください。

2. Unity Adsの「Compatiable SDK」の「Download iOS」のページを開きます。

3. Releasesから最新の「UnityAds.framework.zip」をダウンロードし展開、「UnityAds.framework」があることを確認してください。

f:id:kurisankaku:20170320183759p:plain

3. アダプタのダウンロード

1. 下記公式の Mediation Networks 一覧のページを開いてください。

2. Unity Adsの「Adapter」の「Download iOS」のページを開きます。

3. Filesタブを開き、最新の「UnityAdapter-X.X.X.X.zip」をダウンロードし展開、「UnityAdapter.framework」があることを確認してください。

f:id:kurisankaku:20170320183936p:plain

4. xcodeprojの作成

UnityのメニューバーのFile -> Build Settings を開き、iOSにプラットフォームを設定し、「Build」を実行して、xcodeprojをエクスポートしてください。

5. frameworkを追加

  1. エクスポートされたxcodeprojをXcodeで開いてください。
  2. UnityAds.framework」「UnityAdapter.framework」「GoogleMobileAds.framework」をプロジェクトにドラッグアンドドロップし、追加してください。

f:id:kurisankaku:20170320184129p:plain

6. 実行

実行し、デバイスもしくはシミュレータでアプリが起動し、広告動画が再生されることを確認してください。

CocoaPodsで起きた問題と解決方法

.xcworkspaceが生成されない

下記のような状態の場合は、.xcworkspaceは生成されません。

source 'https://github.com/CocoaPods/Specs.git'
install! 'cocoapods', :integrate_targets => false
platform :ios, '7.0'

target 'Unity-iPhone' do
pod 'Google-Mobile-Ads-SDK', '~> 7.13'
end

integrate_targets」を「true」にし、「pod instal」を実行してください。

install! 'cocoapods', :integrate_targets => true

diff: /../Podfile.lock: No such file or directory エラー

下記のようなエラーが出ている場合

diff: /../Podfile.lock: No such file or directory
diff: /Manifest.lock: No such file or directory
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

1. BuildSettings -> Add User-Defined でユーザー定義を追加します。

f:id:kurisankaku:20170319213311p:plain

2. Keyを 「PODS_ROOT」 値を 「${SRCROOT}/Pods」に設定します。

f:id:kurisankaku:20170319213324p:plain

clang: error: linker command failed with exit code 1 (use -v to see invocation)

それまでに出ていたwarnningを含めたログを見て、修正を判断してください。

ログの内容によって対応方法が変わります。

例えば、duplicate symbol _OBJC_CLASS_$_PodsDummy_Pods_Unity_iPhone in:と出ていた場合は、ライブラリが重複していますので、重複しているものを一つ消すというような形です。

【Unity】AdMob組み込み方法

UnityにAdMobを組み込み、表示する手順を書いていきます。

Admobへのアプリ登録

まず、AdMobを使用するためにアプリを登録します。

1. アプリの作成

1.AdMobの管理ページを開き、収益化ページに遷移し、「新しいアプリを収益化」をクリックしてください。

f:id:kurisankaku:20170319191850p:plain

2.アプリが公開されている場合は、アプリを検索で検索して追加します。今回はアプリを手動で追加します。

アプリ名とプラットフォームを選択してくてください。

f:id:kurisankaku:20170319191902p:plain

3.広告フォーマットの選択と広告ユニット名の設定をします。今回はバナーを選択し、広告ユニット名に識別しやすい名前を入力します。

f:id:kurisankaku:20170319191925p:plain

4.Firebaseアナリティクスの設定です。FIREBASEにリンクさせる場合は、リンクできます。スキップしても問題はありません。

f:id:kurisankaku:20170319191940p:plain

5.完了を押してください。

Android,iOS両方作る場合は、同様にプラットフォームを変えてもう一つ作成してください。

Unityへのプラグイン追加

各使用要件は、公式ドキュメントを参照してください。

※ ここでは、Unity5以上の環境での説明をします。

1. プラグインのダウンロード

UnityでAdMobを使用できるようにするために、プラグインをインポートする必要があります。

まず、下記リンクから最新のunitypackageをダウンロードしてください。

2. プラグインをインポート

1.プロジェクトを Unity エディタで開きます。メニューバーの「Assets」 -> 「Import Package」 -> 「Custom Package」 の順に選択し、ダウンロードした GoogleMobileAdsPlugin.unitypackage ファイルを見つけます。

f:id:kurisankaku:20170319192009p:plain

2.すべてのファイルのチェックボックスがオンになっていることを確認して、「Import」 をクリックします。

f:id:kurisankaku:20170319192022p:plain

インポートが完了すると、AdMobを使用するのに必要なスクリプトやライブラリがAssetsの配下に作成されます。

f:id:kurisankaku:20170319192035p:plain

3. 広告表示スクリプトの作成

広告を表示するためのスクリプトを作成します。今回は基本的なバナー広告の表示方法です。

スクリプトを作成し、Main CammeraなどGameObjectにスクリプトを追加してください。

広告表示に最低限必要なコードを追加したスクリプトが、下記になります。

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

using GoogleMobileAds.Api;

public class AdManagement : MonoBehaviour {

    // Use this for initialization
    void Start () {
        RequestBanner ();
    }

    private void RequestBanner()
    {
        #if UNITY_ANDROID
        string adUnitId = "INSERT_ANDROID_BANNER_AD_UNIT_ID_HERE";
        #elif UNITY_IPHONE
        string adUnitId = "INSERT_IOS_BANNER_AD_UNIT_ID_HERE";
        #else
        string adUnitId = "unexpected_platform";
        #endif

        // Create a 320x50 banner at the top of the screen.
        BannerView bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder()
            .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
            .AddTestDevice("2077ef9a63d2b398840261c8221a0c9b")  // My test device.
            .Build();
        // Load the banner with the request.
        bannerView.LoadAd(request);
    }
}
  • adUnitId・・・AdMobで作成した広告ユニットIDを入れてください。
  • AddTestDevice・・・テストする際に追加するものです。リリースする際は外してください。詳細は次で説明します。

3-1. テストデバイスIDについて

公式ドキュメントに書いてあるとおり、開発段階では表示回数が不正にカウントされないように、テストで使用するデバイスIDを設定してください。

AdRequest request = new AdRequest.Builder()
    .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
    .AddTestDevice("2077ef9a63d2b398840261c8221a0c9b")  // My test device.
    .Build();

バイスIDは広告表示のリクエストを実際に行った際に、実機のログで表示されます。この時、上記で設定した「adUnitId」には適切でない文字列を入れることをおすすめします。広告表示はされませんが、ログにはデバイスIDが下記のように表示されます。(Androidの例。iOSも同様にログに表示されます。)

f:id:kurisankaku:20170319192105p:plain

4. ビルド方法

4-1. Android

Build Settings -> PlatformからAndroidを選択し、「Switch Platform」を押してください。

実機、もしくはエミュレータをつなげ「Build And Run」を押してください。

※ Minimum API Level の相違によってエラーが出る場合は、Player Settings -> Other Settings -> Identification -> Minimum API Level を適切なAPI Levelに設定してください。

4-2. iOS

  1. Build Settings -> PlatformからiOSを選択し、「Switch Platform」を押してください。
  2. Build」を選択し、Xcode プロジェクトをエクスポートします。
  3. Xcodeでプロジェクトを開きます。
  4. googlemobileadssdkios.zip をダウンロードし、「GoogleMobileAds.framework」をFrameworksフォルダにドラッグアンドドロップしてください。
  5. Build、Runを行い実機またはシミュレータで確認します。

f:id:kurisankaku:20170319192121p:plain

メディエーションの組み込み

メディエーションの組み込み方法については、下記記事を参照してください。

www.kurisankaku.xyz