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

cocos2d-xプロジェクトにUnityAdsを導入する(iOS編)

More than 3 years have passed since last update.

UnityAdsというUnity公式の広告SDKがあるのですが
ゲームに特化したビデオ広告ということでとても魅力的です。
のでcocos2d-xのゲームに導入してみました。

UnityAdsに統合ガイドがあるのですがcocos2d-x向けではなく、
下記の通りにやっても動作しなかったので統合ガイドの補足メモです。
※UnityAdsでのアカウント、ゲーム登録はすでに行っている前提です
http://unityads.jp/help/documentation-for-publishers/integration-guide-for-ios

1. ダウンロード

http://unityads.jp/help/documentation-for-publishers/downloads
ガイドの通り、gitHubからインストールします

2. framework, bundleの導入

UnityAds.bundleは必ずプロジェクトに追加します。
(Resourcesとしてbundleがないと実行時エラーとなります)

スクリーンショット 2015-04-29 23.53.17.png

Linked framework and Librariesに以下設定します。
統合ガイドとは違いiOS7以降でもAdSupportは必須のようです。
また、SystemConfiguration, CoreTelephony, CoreMediaも必須のようなので追加しました。
StoreKitも必須ですがcocos標準プロジェクトで追加されているので説明を省きます

スクリーンショット 2015-04-29 23.07.30.png

3. コード修正

統合ガイドではAppDelegateの修正とありますがcocosではAppControllerの修正となります。
(なぜここかというと広告表示までにUnityAdsにUIViewControllerを渡さないといけないからです..)
AppController.hはimport追加とUnityAdsDelegate追加

AppController.h
#import <UIKit/UIKit.h>

//UnityAds
#import <UnityAds/UnityAds.h>

@class RootViewController;

@interface AppController : NSObject <UIApplicationDelegate, UnityAdsDelegate> {
    UIWindow *window;
}

@property(nonatomic, readonly) RootViewController* viewController;

@end

AppController.mmでは以下を行います。cocos2d-x 3.5でのソースとなります。
- _viewController設定後にstartWithGameIdの呼び出し
- unityAdsVideoCompletedの追加

AppController.mm
:
    // Use RootViewController manage CCEAGLView 
    _viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    _viewController.wantsFullScreenLayout = YES;
    _viewController.view = eaglView;

    //Unity Ads
//  [[UnityAds sharedInstance] setTestMode:YES];
//  [[UnityAds sharedInstance] setDebugMode:YES];
    [[UnityAds sharedInstance] startWithGameId:@"[GameID]" andViewController:_viewController];
    [[UnityAds sharedInstance] setDelegate:self];
:
}

//Unity Ads
- (void)unityAdsVideoCompleted:(NSString *)rewardItemKey skipped:(BOOL)skipped
{
    //callback
}

4. Bridge作成

bridgeを作成して動画広告を表示させたいときに呼ぶと最低限の導入完了です。
統合ガイドではcanShowAdsの判別ですが
英語版ドキュメントではcanShowとcanShowAdsを判別したのでそちらに合わせました。

UnityAdsBridge.h
#pragma once

class UnityAdsBridge
{
public:
    static void show();
    static void hide();
};
UnityAdsBridge.mm
#include "UnityAdsBridge.h"
#import <UnityAds/UnityAds.h>

void UnityAdsBridge::show()
{
    if ([[UnityAds sharedInstance] canShow] && [[UnityAds sharedInstance] canShowAds]) {
        [[UnityAds sharedInstance] show];
    } else {
        //cannot show
    }
}

void UnityAdsBridge::hide()
{
    [[UnityAds sharedInstance] hide];
}

その他

  • アプリ新規登録直後の数時間はstart時にサーバエラーとなり広告が表示されませんでした。
  • 動画広告なのでUnityAds#show()時にはBGMをoffにします
  • 実機はもちろん、iOS Simulatorでも広告のテストが可能でした(ありがたい)
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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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