Help us understand the problem. What is going on with this article?

iOS/Android(Unity5.5)で Admobメディエーションで、バナー広告、インタースティシャル広告、動画リワード広告を、最適化した色んな会社の広告をシングルトンで一元化して出す方法

More than 1 year has passed since last update.

タイトル通り、admobメディエーション下記形式で出す際に使っているソースを忘れないようにメモ

  • バナー広告(320x50のフッターバナー等)
  • インタースティシャル広告(リザルト画面等にいった際に全画面表示されるインタースティシャル広告)
  • 動画リワード広告(動画を視聴させて、ゲーム内インセンティブを払ったりする動画側の広告)

導入にあたっては、admobSDK+admobのUnityプラグインと、
各SDKネットワークのSDKが必要なります。
(nendなら、NendSDK(iOS)用+NendUnityプラグイン+Nendのadmob用アダプターが、ネットワーク毎に必要だったり、、汗)

試した環境
Unity5.4 mac
Unity5.5 mac

admobメディエーションを各Unityのシーンから呼び出せるようにsingletonにしたC#ソース

下記、動画リワードは、Applovin、AdColonyを配信するようにしています。

GameSceneSingleton.cs

public class GameSceneSingleton {

    private static GameSceneSingleton mInstance;

    private GameSceneSingleton () { // Private Constructor

    }

    public static GameSceneSingleton Instance {
        get {
            if( mInstance == null ) mInstance = new GameSceneSingleton();
            return mInstance;
        }
    }



    /**********
     *  admob インタースティシャルメディエーション用シングルトン
     **********/

    private InterstitialAd interstitial;
    private AdRequest request;

    private BannerView bannerView;

    bool is_close_interstitial = false;

    // バナーリクエスト
    public void RequestBanner()
    {
        #if UNITY_ANDROID
        string adUnitId = Constant.SDK_ADMOB_BANNER_UNIT_ID;
        #elif UNITY_IPHONE
        string adUnitId = Constant.SDK_ADMOB_BANNER_UNIT_ID;
        #else
        string adUnitId = Constant.SDK_ADMOB_BANNER_UNIT_ID;
        #endif


//      AdSize adSize = new AdSize(50, 320); //縦長カスタマイズしたら
//      Create a 320x50 banner at the top of the screen.
//      bannerView = new BannerView(adUnitId, adSize, AdPosition.Bottom);

        bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.BottomRight);


        // テストデバイス指定
        AdRequest request = new AdRequest.Builder()
            .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
            .AddTestDevice("*************")  // My test device
            .Build();

        // Load the banner with the request.
        bannerView.LoadAd(request);

        bannerView.Hide (); //最初は一旦非表示
    }

    // バナー非表示
    public void BannerHide(){
        if (bannerView != null) {
            bannerView.Hide ();
        }
    }

    // バナー非表示
    public void BannerShow(){
        if (bannerView != null)
        {
            bannerView.Show ();
        }
    }


    // インスティリクエスト
    public void RequestInterstitial()
    {
        #if UNITY_ANDROID
        string adUnitId = Constant.SDK_ADMOB_INSTI_UNIT_ID;
        #elif UNITY_IPHONE
        string adUnitId = Constant.SDK_ADMOB_INSTI_UNIT_ID;
        #else
        string adUnitId = Constant.SDK_ADMOB_INSTI_UNIT_ID;
        #endif

        if (is_close_interstitial == true) {
            interstitial.Destroy ();
        }

        // Initialize an InterstitialAd.
        interstitial = new InterstitialAd (adUnitId);

        // Create an empty ad request.
        //      request = new AdRequest.Builder ().Build ();


        // テストデバイス指定
        AdRequest request = new AdRequest.Builder()
            .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
            .AddTestDevice("***************")  // My test device
            .Build();

        // Load the interstitial with the request.
        interstitial.LoadAd (request);

        interstitial.OnAdClosed += HandleAdClosed;
        //      interstitial.AdClosed += HandleAdClosed;

        is_close_interstitial = false;
    }

    // インタースティシャル広告を閉じた時に走る
    void HandleAdClosed (object sender, System.EventArgs e)
    {
        is_close_interstitial = true;
    }

    // インタースティシャル非表示
    public void InterstitialDestroy(){
        if (is_close_interstitial == true) {
            interstitial.Destroy ();
        }
        RequestInterstitial ();
    }

    // インタースティシャル表示用
    public void InterstitialShow(){
        if (interstitial.IsLoaded ()) {
            interstitial.Show ();
        }
    }




    // admob 動画リワードメディエーション用シングルトン
    private RewardBasedVideoAd rewardBasedVideo;

    public void RequestRewardBasedVideo()
    {

        // 各SDKの初期化
//      AppLovin.SetVerboseLoggingOn("true");

        #if UNITY_ANDROID

        // AppLovin
        AppLovin.InitializeSdk();
        // Preload a rewarded video after you initialize.
        AppLovin.LoadRewardedInterstitial();

        // AdColony
//      AdColony.Configure ("version:1.0,store:google", Constant.SDK_ADC_APP_ID, Constant.SDK_ADC_ZONE_ID);

        #elif UNITY_IOS

        // AppLovin動画リワードSDK
        AppLovin.SetSdkKey(Constant.SDK_APPLOVIN_API_KEY);
        AppLovin.InitializeSdk();

        // AdColonySDK
        AdColony.Configure("1.0", Constant.SDK_ADC_APP_ID, Constant.SDK_ADC_ZONE_ID);

        #endif


        string adUnitId;
        #if UNITY_EDITOR
        adUnitId = "unused";
        #elif UNITY_ANDROID
        adUnitId = Constant.SDK_ADMOB_VIDEO_REWARD_AD_UNIT_ID;
        #elif UNITY_IOS
        adUnitId = Constant.SDK_ADMOB_VIDEO_REWARD_AD_UNIT_ID;
        #else
        adUnitId = "unexpected_platform";
        #endif


        rewardBasedVideo = RewardBasedVideoAd.Instance;

        // テストデバイス指定
        AdRequest request = new AdRequest.Builder()
        .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
        .AddTestDevice("**************")  // My test device
        .Build();


        rewardBasedVideo.LoadAd(request, adUnitId);

        // has rewarded the user.
        rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;
        rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoRewardedClosed;
        rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoRewardedFailed;

    }

    public GameManager gameSceneControlls;
    public void setVideoSdkCallbackListener(GameManager controller)
    {
        gameSceneControlls = controller;
    }



    // 動画再生
    public void pushAds()
    {

        #if UNITY_EDITOR
        #elif UNITY_ANDROID


        if (rewardBasedVideo.IsLoaded()) //admob動画リワードメディエーションが読み込み完了なら
        {
            rewardBasedVideo.Show();
        }

        #elif UNITY_IOS

        if (rewardBasedVideo.IsLoaded()) //admob動画リワードメディエーションが読み込み完了なら
        {
            rewardBasedVideo.Show();
        }

        #else
        #endif
    }

    // 読み込み可能かチェック
    public bool madiationIsLoaded()
    {


        #if UNITY_EDITOR
        return true;
        #elif UNITY_ANDROID

        return rewardBasedVideo.IsLoaded();

        #elif UNITY_IOS
        return rewardBasedVideo.IsLoaded();
        #else
        return false;
        #endif

    }

    // 報酬受け渡し処理
    void HandleRewardBasedVideoRewarded(object sender, Reward args)
    {

    }

    // 動画広告リロード
    void HandleRewardBasedVideoRewardedClosed(object sender, System.EventArgs args)
    {
        RequestRewardBasedVideo();

        if (gameSceneControlls)
        {
            // 指定の視聴完了コールバックメソッド呼び出し。
            gameSceneControlls.mediationVideoFinishedCallBack();
        }

    }

    // ロード失敗時
    void HandleRewardBasedVideoRewardedFailed(object sender, AdFailedToLoadEventArgs args)
    {
        // ここ要確認、無線状態になると永遠にadmobにリクエスト送りまくるので扱い注意
        RequestRewardBasedVideo();
    }

}

  • 各SDK毎にAPI情報など定数は個々に宣言してください。
  • 動画視聴完了のコールバックを受けとるリスナーも記載しています。
  • admobのテストデバイスを必ず登録しておいて方がいいです。(誤タップアカバン対策)

呼び出し処理関連

ゲーム起動時の初期化部分

GameManager.cs
// 〜〜省略

        // admob インスティメディエーションの準備
        GameSceneSingleton.Instance.RequestInterstitial ();

        // admob バナーメディエーション準備
        GameSceneSingleton.Instance.RequestBanner ();

        // admob 動画リワードメディエーション準備
        GameSceneSingleton.Instance.RequestRewardBasedVideo();

// 〜〜省略

再生可能かのチェックと、動画再生

GameManager.cs
// 〜〜省略

    if(GameSceneSingleton.Instance.madiationIsLoaded()){

        Sound.StopBgm ();           //BGMストップ
        videoCallBackFlg = false;   //コールバック済みフラグをリセット

        /// 動画リワード
        GameSceneSingleton.Instance.pushAds();


    }else{

        videoCallBackFlg = false; //コールバック済みフラグをリセット
        VideoFinishedCallBack();

    }

// 〜〜省略

視聴完了のリスナー登録

GameManager.cs
// 〜〜省略

    GameSceneSingleton.Instance.setVideoSdkCallbackListener(this);

// 〜〜省略

matsuyoro
げーむくりえいたー。 顔は濃いが存在の薄さに悩んでいる。 書籍「仕事はたのしいかね」の、大きな事でも試してみればの精神に感銘を受けている。 好きな言葉:好きこそものの上手なれ / 楽は苦の種、苦は楽の種
https://matsudapress.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away