Unity3D Baidu MobAds 배너광고 연동하기

 유니티3D에 중국 바이두의 MobAds 광고 SDK 연동을 정리해보겠습니다. 배너광고와 동영상 광고등 몇가지 있는 듯 한데 그중에서 배너광고에 연동 정리이고 SDK 버전은 3.4입니다.

 유니티3D에서 최종 빌드하는 플러그인 방식연동 실패했기 때문에 유니티3D 프로젝트를 Google Android Project 옵션으로 익스포트해서 플러그인 연동하는 방식으로 진행합니다.


1. 바이두 광고 플러그인 프로젝트 생성

 먼저 유니티3D 프로젝트를 Google Android Project로 익스포트 해주고 이클립스에서 Import 한 후 BaiduMobAdsPlugin 라는 jar lib 프로젝트를 만듭니다. BaiduMobAdsPlugin에 유니티3D classes.jar와 바이두 광고 SDK인 Baidu_MobAds_SDK.jar를 추가하면 아래와 같은 모습이 됩니다.



2. 바이두 광고 플러그인 안드로이드 소스

 안드로이드 플러그인 프로젝트인 BaiduMobAdsPlugin에 BaiduMobAds.java 클래스를 추가한 후 아래 소스 코드를 입력합니다.

package com.westwoodforever.unity3dplugin;

import org.json.JSONObject;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.baidu.mobads.AdView;
import com.baidu.mobads.AdViewListener;
import com.unity3d.player.UnityPlayer;

public class BaiduMobAds {
private static String LOG_TAG = "BaiduMobAds";

private final static int CREATE_ADVIEW = 0;
private final static int CLOSE_ADVIEW = 1;

private static Handler handler;
private static RelativeLayout adViewRelativeLayout;
private static AdView adView;

public static void ShowAd_U() {
CreateHandler();

Message msg = new Message();
msg.what = CREATE_ADVIEW;
handler.sendMessage(msg);
Log.d(LOG_TAG, "Init_U");
}

public static void CloseAd_U() {
Message msg = new Message();
msg.what = CLOSE_ADVIEW;
handler.sendMessage(msg);
Log.d(LOG_TAG, "CloseAd_U");
}

private static void CreateHandler() {
handler = new Handler(Looper.getMainLooper()) {
public void handleMessage(Message msg) {
switch(msg.what) {
case CREATE_ADVIEW:
CreateAdView();
break;
case CLOSE_ADVIEW:
{
CloseAd();
Log.d(LOG_TAG, "CLOSE_ADVIEW");
break;
}
}
}
};
}

private static void CreateAdView() {
RelativeLayout.LayoutParams adViewLayoutParams;
adViewLayoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
adViewLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
//위에 붙이려면
//adViewLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

adViewRelativeLayout = new RelativeLayout(UnityPlayer.currentActivity);

adView = new AdView(UnityPlayer.currentActivity);
/*
AndroidManifest.xml의 BaiduMobAd_APP_ID과 BaiduMobAd_APP_SEC 메타데이터를 코드로 하고 싶다면
adView.setAppSec(UnityPlayer.currentActivity, "111");
adView.setAppSid(UnityPlayer.currentActivity, "222");
*/
adView.setListener(adViewListener);
adView.setLayoutParams(adViewLayoutParams);

adViewRelativeLayout.addView(adView);

ViewGroup.LayoutParams vLayoutParam = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);

UnityPlayer.currentActivity.addContentView(adViewRelativeLayout, vLayoutParam);
}

private static void CloseAd() {
//adViewRelativeLayout.setVisibility(View.GONE);
                //adViewRelativeLayout.removeAllViews();
///*
ViewGroup parent = (ViewGroup)adViewRelativeLayout.getParent();
parent.removeView(adViewRelativeLayout);
//*/
}

private static AdViewListener adViewListener = new AdViewListener(){

@Override
public void onAdClick(JSONObject arg0) {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onAdClick " + arg0.toString());
}

@Override
public void onAdFailed(String arg0) {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onAdFailed " + arg0);
}

@Override
public void onAdReady(AdView arg0) {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onAdReady " + arg0);
}

@Override
public void onAdShow(JSONObject arg0) {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onAdShow " + arg0.toString());
}

@Override
public void onAdSwitch() {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onAdSwitch");
}

@Override
public void onVideoClickAd() {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onVideoClickAd");
}

@Override
public void onVideoClickClose() {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onVideoClickClose");
}

@Override
public void onVideoClickReplay() {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onVideoClickReplay");
}

@Override
public void onVideoError() {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onVideoError");
}

@Override
public void onVideoFinish() {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onVideoFinish");
}

@Override
public void onVideoStart() {
// TODO Auto-generated method stub
Log.w(LOG_TAG, "onVideoStart");
}
};
}


3. 플러그인 익스포트

 플러그인 lib 프로젝트를 빌드 후 jar 파일로 익스포트를 해주는데 바로 유니티3D 프로젝트의 Plugins\Android 폴더로 해줍니다. 이때 기본적인 src만 해주면 됩니다.



4. AndroidManifest, Baidu_MobAds_SDK 복사

 유니티3D 플러그인 폴더에는 Google Android Project로 익스포트했던 프로젝트의 AndroidManifest.xml 파일과 Baidu_MobAds_SDK를 복사해줍니다. 그러면 아래와 같이 3개의 파일이 들어가있겠죠.



 AndroidManifest.xml 파일에는 아래와 같은 내용을 추가합니다. 메타데이터는 application 태그안에 추가합니다.

  <!-- 바이두 MobAds용 퍼미션-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />


<!-- 바이두 MobAds 액티비티와 메타데이타-->
        <meta-data android:name="BaiduMobAd_APP_ID" android:value="debug" />
        <meta-data android:name="BaiduMobAd_APP_SEC" android:value="debug" />
        <activity android:name="com.baidu.mobads.AppActivity"
            android:configChanges="keyboard|keyboardHidden|orientation" />


 BaiduMobAd_APP_ID와 BaiduMobAd_APP_SEC 메타데이터는 디버그시에는 "debug"로 해주고 배포때는 할당받은 값을 넣어줍니다. 또는 2번의 소스코드로 설정해도 됩니다.


<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />

 이 값은 true를 해줘서 바이두 광고가 터치를 받을 수 있게 해줍니다.


5. 유니티3D 컴포넌트 수정

 간단한 BaiduMobAdsManager 컴포넌트와 MainCamera에 붙일 testGUI 컴포넌트 소스코드입니다.

//BaiduMobAdsManager.cs
using UnityEngine;
using System.Collections;

public class BaiduMobAdsManager : MonoBehaviour {
//private AndroidJavaObject curActivity;
private AndroidJavaClass pluginClass;
static BaiduMobAdsManager _instance;
public string strLog = "WestwoodForever's Unity3D Baidu MobAds Sample";

public static BaiduMobAdsManager Getinstance()
{
if(_instance == null)
{
_instance = new GameObject("BaiduMobAdsManager").AddComponent<BaiduMobAdsManager>();
}
return _instance;
}

void Awake()
{
//AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
//curActivity = jc.GetStatic<AndroidJavaObject> ("currentActivity");
pluginClass = new AndroidJavaClass("com.westwoodforever.unity3dplugin.BaiduMobAds");
}

public void ShowAd()
{
pluginClass.CallStatic("ShowAd_U");
}

public void CloseAd()
{
pluginClass.CallStatic("CloseAd_U");
}
}


//testGUI.cs
using UnityEngine;
using System.Collections;

public class testGUI : MonoBehaviour {

// Update is called once per frame
void Update () {
if (Application.platform == RuntimePlatform.Android)
{
if (Input.GetKey(KeyCode.Escape))
{
Application.Quit();
return;
}
}
}

void OnGUI()
{
float fXpos = 0;
float fYpos = 0;

GUI.Label(new Rect(fXpos, fYpos, 400, 100), BaiduMobAdsManager.Getinstance().strLog);

fYpos += 50;
if (GUI.Button(new Rect(fXpos, fYpos, 100, 50), "ShowAd") == true)
{
BaiduMobAdsManager.Getinstance().ShowAd();
}

fYpos += 50;
if (GUI.Button(new Rect(fXpos, fYpos, 100, 50), "CloseAd") == true)
{
BaiduMobAdsManager.Getinstance().CloseAd();
}
}
}


6. 빌드 및 실행

 유니티3D에서 Google Android Project로 기존에 익스포트한 폴더로 또 익스포트를 해준 후 이클립스에서 F5를 눌러 갱신하면 아래와 같습니다.



 실행 후 ShowAd를 누르면 아래와 같이 제일 밑에 광고뷰와 양 옆으로 추가 아이콘들이 생깁니다.


 아래 그림은 CloseAd시 adView.setVisibility(View.GONE); 로 해줬을 때 증상입니다. adViewRelativeLayout.setVisibility(View.GONE); 로 해줘도 마찬가지구요.



 //adViewRelativeLayout.removeAllViews();
ViewGroup parent = (ViewGroup)adViewRelativeLayout.getParent();
parent.removeView(adViewRelativeLayout);

 2번 내용과 같이 위 둘중에 하나로 해줘야 파란색 창도 사라집니다. 그런데 여전히 양옆 아이콘을 사라지질 않네요. 딱히 AdView 클래스에 함수가 있는것도 아니고 ... 이거 사라지는 방법 아시는분은 뎃글로 좀 알려주시면 감사하겠습니다.


 간단하게 정리해봤습니다. 수정 작업이 있을때마다 2, 3, 5, 6 과정을 반복하시면 되겠네요. 나머지 광고 기능도 나중에 여유가 있으면 정리해보겠습니다.

이 블로그의 인기 게시물

CMake Windows에 설치하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

Unity3D 안드로이드 Keystore 생성하기