cocos2d-x 3.3でUnityAdsを表示する方法(Android)


#共通の環境準備
##1．アカウント登録
UnityAdsでUnity Developer Networkアカウントの登録
広告を紐付けるプロジェクトを追加します。

##2．SDKの準備
githubでsdkが公開されているので、そこからDownload
https://github.com/Applifier/unity-ads-sdk

2015/11/03現在で最新のバージョンver1.5.3を落とすとAndroid5.1.1にしか対応しないので、Android4.2.2以上はver1.4.7のダウンロードをお勧めします。

#Androidの広告表示
Eclipse前提
##1．EclipseにSDKをインポートする。
EclipseのFile->Importから[Existing Projects into Workspace]を選択
unity-adsをインポート

[Properties]の[Android]からLibraryの[Add]を選択し、Unity-adsを選択して追加します。

UnityAdsをAPK作成時の大元プロジェクトから[Properties]を選択
[Java Build Path]の
・[projects]に[Unity-ads]を追加
・[Order And Export]で[Unity-ads]にチェックを入れる
・[Libraries]にunity-ads.jarを追加

##2．AppActivity.javaにUnityAdsのコードを追加する

```lang:AppActivity.java
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);
    }
@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) {
}
```

```lang:UnityAdsJni.h
#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__
```

```lang:UnityAdsJni.cpp
#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;

        // オブジェクトの解放
        methodInfo.env->DeleteLocalRef(methodInfo.classID);

        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);
         
        // オブジェクトの解放
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }
 
#ifdef __cplusplus
}
#endif
```

```lang:UnityAdsWrapper.h
class UnityAdsWrapper
{
public:
    /**
     * UnityAdsの広告有無
     */
    static bool canShow();
    /**
     * UnityAdsの広告表示
     */
    static void show();
};
```

```lang:UnityAdsWrapper.cpp
#include "UnityAdsWrapper.h"
#include "UnityAdsJni.h"
 
/**
 * UnityAdsの広告有無
 */
bool UnityAdsWrapper::canShow()
{
    return canShowJni();
}
/**
 * UnityAdsの広告表示
 */
void UnityAdsWrapper::show()
{
    showJni();
}
```


#実際の使い方
実際に表示するためのメソッドを記載して行きます。
UnityAdsは単純に表示することは出来ず、
広告の表示準備が出来るかチェックして表示しなければなりません。
その為、準備完了か問い合わせるUnityAds.canShow()を使って、
完了であれば、UnityAds.Show()を実行するようにしなければいけません。

```
if(UnityAdsWrapper::canShow())
{
    UnityAdsWrapper::show();
}
```

UnityAdsへの登録後すぐには広告表示ができないので、
もし表示できなければしばらく立ってから表示を試してください。