Unity3D中使用有米广告SDK By Android Studio

最近准备对接广告SDK, 网路上搜索全是有米SDK的,fuck~ 有些还是几年前的版本
于是我决定作死,使用最新的 Android Studio 1.2.2 来打包Jar. 对接有米SDK, Unity3D 使用 5.1.2 版本,顺便试下调用Android 函数.

打开创建一个Project
create_project

这里注意下下面的包名 dreamfairy.com.adtest 之后要在Unity中填,要一模一样
点击Next

select_devices

什么都不用改,直接Next

add_activity

这里选择 Blank Activity 后点击 Finish 等 项目初始化后,开始正式工作

因为对接的是有米SDK
去官网下个Jar
地址
https://www.youmi.net/sdk/android/15/youmi_android_sdk_normalads_v5.00_2015-01-08.zip
我用的是无积分版

然后把Untiy3D的接口Jar找出来
位置在这里
UnityEditorDataPlaybackEnginesandroidplayerreleasebinclasses.jar

然后把这2个SDK放到 Android Studio 的项目文件夹的 lib 目录中
AdTestbumpmapadapplibs

add_as_lib

在项目中选中这2个jar文件右键,点击 Add As Library
之后我们就可以使用它们的API了。

打开项目默认创建的 MainActivity.java
输入下面的代码

[cc language=”java”]
package dreamfairy.com.adtest;

import android.content.Intent;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.view.ViewGroup.LayoutParams;

import com.unity3d.player.UnityPlayerActivity;

import net.youmi.android.AdManager;
import net.youmi.android.banner.AdSize;
import net.youmi.android.banner.AdView;
import net.youmi.android.spot.SpotManager;

public class MainActivity extends UnityPlayerActivity {
Context mContext = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
AdManager.getInstance(this).testInit(“e1c835e11e087618”, “099eed9efccd3c3b”, true);

LinearLayout layout = new LinearLayout(this);
addContentView(layout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
AdView adView = new AdView(this, AdSize.SIZE_320x50);
LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
layout.addView(adView, params);

SpotManager.getInstance(this).loadSpotAds();
SpotManager.getInstance(this).setSpotOrientation(
SpotManager.ORIENTATION_LANDSCAPE);

SpotManager.getInstance(this).showSpotAds(this);

Log.d(“OnMainActivityCreate”, “”);
}

public void showSpot()
{
Log.d(“OnUnityCall”,”ShowSpot!”);
}
}
[/cc]

在OnCreate的时候会加载一个youmi的悬浮广告
然后创建一个自定义函数 showSpot() 之后使用Unity调用它,在安卓下打印日志测试

之后打开AndroidManifest.xml 内容如下
[cc language=”xml”]















[/cc]

设置一下权限和主Activity MainActivity

最后是编译jar了, 这里和 Eclipse 不一样,需要编写 gradle 命令
打开位于你 app 目录下的 build.gradle 而不是 项目下的 build.gradle

modify_build_gradle

编写的build.gradle 内容如下
[cc language=”java”]
apply plugin: ‘com.android.library’

android {
compileSdkVersion 22
buildToolsVersion “23.0.0 rc2”
sourceSets {
main {
//Path to your source code
java {
srcDir ‘src/main/java’
}
}
}

defaultConfig {
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName “1.0”
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}

lintOptions {
abortOnError false
}
}

dependencies {
compile fileTree(include: [‘*.jar’], dir: ‘libs’)
compile ‘com.android.support:appcompat-v7:22.2.0’
compile files(‘libs/classes.jar’)
compile files(‘libs/YoumiSdk_v5.00_2015-01-08.jar’)
compile ‘com.android.support:appcompat-v7:22.2.0’
}

//task to delete the old jar
task deleteOldJar(type: Delete) {
delete ‘release/AndroidPlugin.jar’
}

//task to export contents as jar
task exportJar(type: Copy) {
from(‘build/intermediates/bundles/release/’)
into(‘release/’)
include(‘classes.jar’)
///Rename the jar
rename(‘classes.jar’, ‘AndroidPlugin.jar’)
}

exportJar.dependsOn(deleteOldJar, build)
[/cc]

这里我们创建了2个任务,一个是删除旧的jar 叫 deleteOldJar
一个是创建新的jar 叫 exportJar
exportJar.dependsOn(deleteOldJar, build)
能保证 先执行 deleteOldJar 任务后 执行 exportJar

最后在 Gradle projects 面板上双击 exportJar 任务 或者 在命令行下输入命令 就可以编译Jar了

exec_task

这里截图里显示了上一次编译成功的输出 BUILD SUCCESSFUL 和 上一次输入的命令 gradlew exportJar

输出成功后,在下面的目录下可以找到生成的文件
AndroidStudioProjectsbumpmapadappbuildintermediatesbundlesreleaseclasses.jar

之后是Unity的部分
在Unity Assets 目录下创建一个文件夹 Plugins ,之后在 Plugins 下再创建一个文件夹 Android
然后把刚才生目录下AndroidStudioProjectsbumpmapadappbuildintermediatesbundlesrelease 的所有文件全部拷贝过来
并把AndroidStudioProjectsbumpmapadappbuildintermediatesbundlesreleaselibsclasses.jar 删除
这是Unity3D 自带的API,导入Unity3D后会冲突的。。

项目结构如下
unity_andorid_list

好了,我们编写一个调用代码
Main.cs
[cc language=”csharp”]
using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

if (Input.GetKey(KeyCode.Escape))
{
Application.Quit();
}

}

void OnGUI()
{
var buttonWidth = 100;
var buttonHeight = 50;

var buttonX = (Screen.width – buttonWidth) / 2.0f;
var buttonY = (Screen.height – buttonHeight) / 2.0f;

//在屏幕中间绘制一个button组件
if (GUI.Button(new Rect(buttonX, buttonY, buttonWidth, buttonHeight), “Press Me!”))
{
AndroidJavaClass unity = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject currentActivity = unity.GetStatic(“currentActivity”);
currentActivity.Call(“showSpot”);
}
}
}
[/cc]

在屏幕中央创建一个button 点击的时候调用 安卓自定义函数 showSpot
然后把这个脚本挂到相机上

然后打开player setting 设置标识 把包名要填写的和 Android Studio 中创建的 project 一致
unity_id

最后可以build apk了

在build 过程中可能会遇到2个问题
1.Error retrieving parent for item: No resource found that matches the given name ‘Theme.AppCompat.Light.DarkActionBar’.
解决方法,直接去把这个主题删了,因为我们 GOOGLE API LEVEL 不够高,没有这个主题,反正也用不到
到 resvaluesvalues.xml 里找到 DarkActionBar 相关的节点都删除掉
2.No resource identifier found for attribute ‘showAsAction’ in package
解决方法,还是API不够高,也是用不到还是删,路径在 resmenumenu_main.xml 找到这个属性,删掉

finally

ad_testad_test1

最后我们点击按钮 “press me”
看看 logcat 的输出
unity_call_logcat
倒数第二行就可以看到 输出啦

发表评论

电子邮件地址不会被公开。 必填项已用*标注