番外篇 之 实现Unity和Android进行交互(基于Android(安卓)Studio 3.1.1以及Jar包方式)
LZ-Says:规矩的背后是自由,自由的背后,是坦然~ ^_^
前言
Hello,大家好,我胡汉三又回来了~!!!
时隔多日不见,有木有一种,士别三日,当刮目想看的赶脚~~~
今天为带来番外篇,为什么叫做番外篇呢,因为没有接触过,哈哈~
不扯犊子了,今天为大家带来Android Studio 3.1.1 打Jar包供Unity使用。
本文目标
通过LZ泪崩的实践,让你我下次面对提供Unity小伙伴Jar包时能够很装逼的来一句,等着,分分钟,都是小意思~
突然有点怀念当年了,哈哈~
基础了解
本文基础环境搭建完毕的小伙伴,如有不懂,可查阅下面俩篇文章:
菜鸡学Unity 之 Untiy 下载(安装)与破解(基于Unity 2017版)
菜鸡学Unity 之 创建项目并预览游戏运行(基于Window平台)
其次,还要额外补充几点,关于Unity配置JDK以及SDK版本:
而关于过程中的异常,则各位老铁移步下面这篇博文:
菜鸡学Unity 之 坑神之路 (记录坑点,不断更新中~)
另外,我们还需要记住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官方直接下载
https://unity3d.com/get-unity/download/archive
方式二:百度网盘下载
链接:https://pan.baidu.com/s/11Fl-4FXk-mm_2DAiG1lp3Q 密码:jcya
方式三: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 : 925954424@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>
要注意,以下为必填项:
"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("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查看地址
https://github.com/HLQ-Struggle/UnityDemo
个人公众号
欢迎关注,不定时发布~~~
赞赏
如果感觉不错,不妨赞助LZ~ 3q~~~
参考资料
- https://answers.unity.com/questions/1147298/where-can-i-download-android-build-support-531f1.html;
- https://blog.csdn.net/builder_taoge/article/details/70170590;
更多相关文章
- Android(安卓)Studio下使用AIDL创建和使用远程service
- Assets 与 Res android的两大资源的获取 与android studio中asse
- Android(安卓)ROM开发(三)——精简官方ROM并且内置ROOT权限,开启Rom
- android创建快捷方式来打开应用中特定的Activity
- 详解Android(安卓)Surface系统
- Android(安卓)各种Context区别
- android调试中怎样使用gcc提供的工具
- android实现解析webservices
- Android(安卓)FFmpeg