今回のエンジニアブログを担当する大原です。
昨今、カジュアルゲームには動画広告を入れているパターンが多くなってきました。
動画広告の売上話題によくあがる某ク◯ッシー◯ードも使っているUnityAdsをCocos2d-xで使えるようにしてみようかと思います。
共通の環境準備
1.アカウント登録
UnityAdsでUnity Developer Networkアカウントの登録をしてください。
広告を紐付けるプロジェクトを追加します。
2.SDKの準備
githubでsdkが公開されているので、そこからDownloadしてください。
https://github.com/Applifier/unity-ads-sdk
Androidの広告表示
1.EclipseにSDKをインポートする。
Eclipseを使っている人前提で書きます。
EclipseのFile->Importから[Existing Projects into Workspace]を選択します。
Downloadしたsdkからunity-adsを選択してインポートしてください。
Propertiesの[Android]からLibraryの[Add]を選択し、Unity-adsを選択して追加します。
2.AppActivity.javaにUnityAdsのコードを追加する
まずアプリ起動時にUnityAdsを使えるように初期化します。
import com.unity3d.ads.android.IUnityAdsListener; import com.unity3d.ads.android.UnityAds; public class AppActivity extends Cocos2dxActivity implements IUnityAdsListener{ @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); UnityAds.init(this, "[GAME_ID]", this); }
AppActivityにimplements IUnityAdsListenerを追加してコールバックを受け取れるようにします。
onCreate()をオーバーライドして、UnityAds.init()を宣言し初期化します。
第1引数にActivityを指定し、第2引数にUnityAdsの管理画面で登録したGameIDを追加します。
第3引数にIUnityAdsListenerを指定し、コールバックを受け取れるようにします。
IUnityAdsListenerで受け取れるコールバックとしては
@Override /** * 動画在庫がある場合のコールバック */ public void onFetchCompleted() { } @Override /** * 動画在庫がない場合のコールバック */ public void onFetchFailed() { } @Override /** * UnityAdsが表示されたコールバック */ public void onHide() { } @Override /** * UnityAdsが閉じられたコールバック */ public void onShow() { } @Override /** * 動画の再生開始コールバック */ public void onVideoStarted() { } @Override /** * 動画の再生完了コールバック * @param key インセンティブキー * @param skip スキップしたか */ public void onVideoCompleted(String key, boolean skip) { }
3.JNIでアクセスするためのコードの記載
JNIで繋げるためのメソッドを用意しておきます。
/** * UnityAdsの広告表示準備が完了しているか * @return 表示可能 */ public static boolean canUnityAdsShow() { return UnityAds.canShow(); } /** * UnityAdsの広告を表示する */ public static void showUnityAds() { UnityAds.show(); }
呼び出しのJNIソースを記載します。
#ifndef __UNITYADS_JNI_H__ #define __UNITYADS_JNI_H__ #include <jni.h> #ifdef __cplusplus extern "C" { #endif extern bool canShowJni(); extern void showJni(); #ifdef __cplusplus } #endif #endif // __UNITYADS_JNI_H__
#include "UnityAdsJni.h" #include "platform/android/jni/JniHelper.h" #include <android/log.h> #define LOG_TAG "UnityAdsJni" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) #define CLASS_NAME "org/cocos2dx/cpp/AppActivity" using namespace cocos2d; #ifdef __cplusplus extern "C" { #endif bool canShowJni() { JniMethodInfo methodInfo; if (! JniHelper::getStaticMethodInfo(methodInfo, CLASS_NAME, "canUnityAdsShow", "()Z")) { LOGD("Failed to find static method of canUnityAdsShow"); return false; } // Android側のメソッドコール jboolean ans = (jboolean)methodInfo.env->CallStaticBooleanMethod(methodInfo.classID, methodInfo.methodID); bool ret = false; if(JNI_TRUE == ans)ret = true; return ret; } void showJni() { JniMethodInfo methodInfo; if (! JniHelper::getStaticMethodInfo(methodInfo, CLASS_NAME, "showUnityAds", "()V")) { LOGD("Failed to find static method of showUnityAds"); return; } // Android側のメソッドコール methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID); } #ifdef __cplusplus } #endif
iOSの広告表示
1.SDKを追加する
xcodeのプロジェクトファイルに
・UnityAds.framework
・UnityAds.bundle
を追加します。
UnityAds.bundleはResourceフォルダに入れないと起動できません。
[Linked Frameworks and Libraries]に
・StoreKit.framework
・AdSupport.framework
・CoreTelephony.framework
を追加します。
2.AppControllerの初期化時にUnityAdsも初期化する
UnityAds.hのインポートと
interfaceにUnityAdsDelegateを追加します。
#import <UIKit/UIKit.h> //UnityAds #import <UnityAds/UnityAds.h> @class RootViewController; @interface AppController : NSObject <UIApplicationDelegate ,UnityAdsDelegate> { UIWindow *window; } @property(nonatomic, readonly) RootViewController* viewController; @end
RootViewControllerの初期化直後にUnityAdsの初期化を行う。
// Use RootViewController manage CCEAGLView _viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil]; _viewController.wantsFullScreenLayout = YES; _viewController.view = eaglView; //Unity Ads [[UnityAds sharedInstance] startWithGameId:@"[GameID]" andViewController:_viewController]; [[UnityAds sharedInstance] setDelegate:self]; // Set RootViewController to window if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0) {
//Unity Ads - (void)unityAdsVideoCompleted:(NSString *)rewardItemKey skipped:(BOOL)skipped { //callback }
AndroidとiOSからの呼び出しコード
クロスプラットフォームで呼べるように共通の
ヘッダーファイルを用意します。
class UnityAdsWrapper { public: /** * UnityAdsの広告有無 */ static bool canShow(); /** * UnityAdsの広告表示 */ static void show(); };
Androidコード
#include "UnityAdsWrapper.h" #include "UnityAdsJni.h" /** * UnityAdsの広告有無 */ bool UnityAdsWrapper::canShow() { return canShowJni(); } /** * UnityAdsの広告表示 */ void UnityAdsWrapper::show() { showJni(); }
iOSコード
#import <Foundation/Foundation.h> #import <UnityAds/UnityAds.h> #import "UnityAdsWrapper.h" /** * UnityAdsの広告有無 */ bool UnityAdsWrapper::canShow() { if ([[UnityAds sharedInstance] canShow] && [[UnityAds sharedInstance] canShowAds]) { return true; } else { return false; } } /** * UnityAdsの広告表示 */ void UnityAdsWrapper::show() { [[UnityAds sharedInstance] show]; }
実際の使い方
実際に表示するためのメソッドを記載して行きます。
UnityAdsは単純に表示することは出来ず、
広告の表示準備が出来るかチェックして表示しなければなりません。
その為、準備完了か問い合わせるUnityAds.canShow()を使って、
完了であれば、UnityAds.Show()を実行するようにしなければいけません。
if(UnityAdsWrapper::canShow())
{
UnityAdsWrapper::show();
}
UnityAdsへの登録後すぐには広告表示ができないので、
もし表示できなければしばらく立ってから表示を試してください。