引言
最近为了实现Unity与Android之间的通信,在网络上发现了很多种实现方案。有打包Jar的,有打包aar的,有直接拷贝文件的。试了几种方案虽然都能解决需求,但是使用起来给我的感觉并不是很舒服。在各种尝试中,已了解了Unity和Android之间通信的底层原理。该方案为本人结合Java特性所给出,可以减少很多其它方案的一些不明确以及繁琐的步骤。
本文适用对象
有一定的Unity开发经验,会使用Unity
有一定的Android开发经验,会使用AndroidStudio
方案优势
不需要引用unity下的class.jar
不用在Unity的/Plugins/Android下放置AndroidManifest.xml文件
Unity打包时PackageName不依赖于引用文件
发布简单,只需要导出arr并直接拷贝到/Plugins/Android目录下即可使用,不用对文件做任何修改
文章DEMO对应的IDE版本
AndroidStudio 3.0 (2.1亲测通过)
Unity 2017.2 (5.4.3亲测通过)
流程
Android部分
创建AndroidStudio项目
首先我们打开AndroidStudio,并创建一个新项目,这里随便填写项目名、包名即可,因为这个项目我们后面并不会用到。
SDK我们选最低的就行。
Activity我们选个EmptyActivity也行。
1.png
然后我们点击「Finish」完成AndroidStudio项目创建。
创建和unity交互的Moudle项目
项目创建好以后开始我们的主菜,选中app然后新建一个moudle
2.png
类型选择「Android Library」
3.png
Application/Library name认真填写,之后为arr导出的名称,这里我们叫「MyUnityLib」。
Module name没有强迫症就不用管它
Package name认真填写,之后unity里会用到,不过它和unity导出的包名没有什么关系这里我们叫「com.jing.unity」好了
Minimum SDK能选多低选多低,反正不超过unity发布的版本就行
4.png
创建
然后我们在com.jing.unity包下创建一个类,作为Unity和Android通信的核心类,名字尽量炫酷一点,这里我们叫「Unity2Android」
6.png
编写Android端代码
然后我们直接粘贴该类的代码,讲解直接看注释。这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「callUnity」这两个方法,有一定的开发经验应该很容易理解。
这里我们实现一个简单的接口「showToast」。
导出arr准备给unity使用
代码写好了我们选中module然后选择「Build」「Rebuild Project」
7.png
接着将这个arr文件找到,就是我们要导入到unity的文件了。
Unity部分
创建一个unity项目
创建目录Assets/Plugins/Android,并将刚才导出的arr文件放到该文件夹下,我们的导入就算完成了。没错就是这么Easy,然后我们看看怎么来调用它。
8.png
在界面上放一个按钮,并且创建一个Script绑定到「Main Camera」。用一个文本控件来展示Android发送过来的消息。
Script的代码内容如下
然后打包APK到我们的Android设备上进行测试。
9.png
点击按钮,查看效果
10.png
DEMO地址
结束语
aar和jar的区别各位可以自行百度了解。
如果要对接第三方库,可以在moudle下对接,并打包aar给Unity使用。切记jar需要放到aar的libs下引用,才可以在打包的时候一并导出。通过gradle的网络下载编译方式是不会被打包到aar中的。gradle网络下载的文件的jar可以自行百度查看如何找到。