番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)
LZ-Says:规矩的背后是*,*的背后,是坦然~ ^_^
前言
Hello,大家好,我胡汉三又回来了~!!!
时隔多日不见,有木有一种,士别三日,当刮目想看的赶脚~~~
今天为带来番外篇,为什么叫做番外篇呢,因为没有接触过,哈哈~
不扯犊子了,今天为大家带来Android Studio 3.1.1 打Jar包供Unity使用。
本文目标
通过LZ泪崩的实践,让你我下次面对提供Unity小伙伴Jar包时能够很装逼的来一句,等着,分分钟,都是小意思~
突然有点怀念当年了,哈哈~
基础了解
本文基础环境搭建完毕的小伙伴,如有不懂,可查阅下面俩篇文章:
其次,还要额外补充几点,关于Unity配置JDK以及SDK版本:
而关于过程中的异常,则各位老铁移步下面这篇博文:
另外,我们还需要记住Unity版本更新的一些和我们有关的特性:
Unity 5.x 开始支持使用 aar 文件
Unity 5.4 开始导出 Gradle 工程
最后,开启我们的爽歪歪之路吧~
Android 生成Jar
Step 1:创建Android工程
Step 2:创建Android Library Module
Step 3:去Unity本地安装目录拷贝jar包
这一步需要去你Unity本地安装目录下拷贝Jar包,地址如下:
\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
这里可能会遇到一个问题,就是在PlaybackEngines目录下找不到AndroidPlayer的问题,这里简单带大家解决下:
这里提供大家几种方式下载Android Support:
方式一:Unity 3D官方直接下载
方式二:百度网盘下载
方式三:Unity打开Build Settings选择Android,点击右侧Open Download Page
接下来就是无脑式安装,各位自行安装即可。
安装完成后,打开Unity安装目录,就会发现AndroidPlayer目录神奇般的出现了~
到上面给出的Jar包地址拷贝Jar。
Step 4:将拷贝的Jar放置到Android Library Module
Step 5:创建Activity,继承自UnityPlayerActivity
Step 6:创建测试Activity,并为LoadingActivity对外公开方法
首先定义如下布局样式,以方便接下来我们的测试:
随后编辑TestActivity,这里主要有以下几方面内容:
显示图片资源;
测试Unity触发Android按钮事件;
测试Unity往Android传值并显示
So,TestActivity代码如下:
/**
* author : HLQ
* e-mail : aaa@qq.com
* time : 2018/4/19
* desc : 测试在nity中跳转
* version: 1.0
*/
public class TestActivity extends AppCompatActivity {
private Button mShowBtn;
private TextView mUnityInfoShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
initView();
String msg = getIntent().getStringExtra("UnityTest");
if (!TextUtils.isEmpty(msg)) {
setUnityText(msg);
}
}
private void initView() {
mShowBtn = findViewById(R.id.btn_show);
mUnityInfoShow = findViewById(R.id.tv_unity_info_show);
initEvent();
}
private void initEvent() {
mShowBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(TestActivity.this, "Unity触发Jar按钮事件", Toast.LENGTH_SHORT).show();
}
});
}
});
}
/**
* Unity传值 Android Jar 接收并显示
*
* @param unityText
*/
public void setUnityText(String unityText) {
mUnityInfoShow.setText(unityText);
}
}
最后,LoadingActivity中对Unity暴露一个接收值得方法如下:
/**
* Unity传值 Android Jar 接收并显示
*
* @param unityText
*/
public void setUnityText(String unityText) {
Intent startIntent = new Intent(LoadingActivity.this, TestActivity.class);
startIntent.putExtra("UnityTest", unityText);
startActivity(startIntent);
}
Step 7:build.gradle新增打包脚本
// 定义SDK包名称
def SDK_BASENAME = "AndroidPlugin"
// 定义SDK包版本
def SDK_VERSION = "_V1.0.0"
// SDK包生成地址
def SDK_PATH = "build/libs"
// 删除之前的Jar包 保证每一次生成的都是最新的
task deleteOldJar(type: Delete) {
delete SDK_PATH + SDK_BASENAME + SDK_VERSION + '.jar'
}
task exportJar(type: Copy) {
// 从源地址拷贝
from('build/intermediates/packaged-classes/release/')
// 存放
into(SDK_PATH)
// 导入
include('classes.jar')
// 重命名
rename('classes.jar', SDK_BASENAME + SDK_VERSION + '.jar')
}
// 执行脚本文件
exportJar.dependsOn(deleteOldJar, build)
这里需要注意一点,如下:
2.3 之前
from(‘build/intermediates/bundles/release/’)2.3 之后
default和debug debug目录之前也是有的,没有变化,只是原来的release目录被现在的default目录代替了。3.1 之后
之前有的bundle目录现在没有了(classes.jar文件在里面),取而代之的是packaged-classes目录
Step 8:执行脚本,开始打包
点击右侧Gradle,选择刚刚新建的Lib工程,点击other,如下图:
找到exporJar,用力双击:
成功会有如下提示:
下面查看生成的Jar包:
Ok,到此,Android打Ja包告此一段落,可以简单的松口气了~
Unity调用Jar包(Unity与Android简单交互)
喝杯茶,抽根烟,让我们继续开动~
Step 1:新建Unity工程,导入Jar包以及资源文件
在Assets目录下创建Plugins、Android以及libs目录,如下:
将Jar包拷贝到libs目录下:
如上图,导入时需要注意,Windows环境下需要使用WinRAR打开并删除buildConfig文件,具体原因请看文章开头异常总结。
接下来复制相关资源文件:
Step 2:复制AndroidManifest并修改
修改后如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:label="@string/app_name">
<activity android:name="com.hlq.hlqlib.activity.LoadingActivity"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<activity android:name="com.hlq.hlqlib.activity.TestActivity" />
</application>
</manifest>
要注意,以下为必填项:
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
Step 3:创建脚本文件,关联Main Camera
关联很Easy,点击Main Camera,选择右侧下方的Add Component,搜索刚刚创建的Test确定即可。
Step 4:绘制按钮,调用Jar包
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnGUI()
{
if (GUI.Button(new Rect(100, 100, 300, 150), "点我啊~"))
{
// 获取unity的Java类,只能调用静态方法,获取静态属性
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
// 获取当前的Activity对象,能调用公开方法和公开属性
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("setUnityText", "This is Unity info.");
}
}
}
Step 5: 配置基本属性
点击File,选择Build Setting…
这里需要配置Id也就是包名以及最小兼容版本号,如下图:
Step 6:点击Build,生成APK,运行查看实例
这里需要注意一点,首次运行会出现如下异常:
问题原因如下:
我们先来看下TestActivity继承关系:
TestActivity extends AppCompatActivity
它依赖 com.android.support:appcompat-v7:26.1.0 ,所以针对目前这种情况,LZ给出俩个解决方案:
TestActivity extends Activity: android.app.Activity
下载对应v7包,拷贝Unity Libs目录下即可。(LZ未测试)
题外话
有些老铁问我,为什么不撸了呢,如下图所示:
以及最惨痛的事儿:
最后:
GitHub查看地址
个人公众号
欢迎关注,不定时发布~~~
赞赏
如果感觉不错,不妨赞助LZ~ 3q~~~