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


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がないと実行時エラーとなります)

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

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でも広告のテストが可能でした(ありがたい)