1.配置工程
这里我使用的Unity版本是2021.3.4,Android Studio是2021.2。
其实打包的我认为最主要的问题就是版本兼容,因为不同的版本有不同的迭代更新,使用最新版本进行打包的时候我基本会多多少少遇到一些报错,但其实就是一些简单的文件或者语句的增删,这些错误在以前的打包坑中往往会有解答,耐心多查查资料就出来了。
先下载一个雷电模拟器测试用雷电安卓模拟器-手游模拟器安卓版_android手机模拟器电脑版_雷电模拟器官网 (ldmnq.com)
这里我建议直接使用UnityHub自动下载好安卓所需要的配置JDK和SDK,因为我自己去官网下载经常遇到一些版本不符合要求的错误。
新建一个安卓工程,然后启动模拟器。
一般新建安卓工程左边和下面会有个进度条展示,表示这个项目还在构建中,等待构建完毕就可以了。
构建完成会出现一些文件
打开模拟器,打开安卓下面的Logcat窗口,点击运行,然后会自动在模拟器上面安装好安卓文件并且运行,就配置成功了。
再检查Unity的JDK和SDK配置就ok了。
2.打包测试
使用Unity打安卓包,先转换到平台,记得勾选Export Project导出文件包,而不是直接打apk包。
这里我第一次导出的时候直接给我闪退了- -。。。
然后第二次重新打包就可以了。????上面闪退我估计是我电脑开的东西太多了
然后使用 Android Studio 导入刚刚打包的文件
然后点击运行,然后我这里报错了,打开下面的build控制输出能看到错误信息,查了下资料说这里的提示意思是说版本不同
先找到gradle.properties把这段代码删掉 android.enableR8=false
然后把下图中的gradle修改为7.0.1的版本,这里并不清楚Unity打出来的文件和安卓所需要的版本为啥不一样
然后运行,就会自动在模拟器上面安装好我们刚刚的Unity工程项目,然后运行就能看到了。
可以看到我标记的框框里面的名字正好对应Unity的PackageName名字
3.交互测试
打开新建的安卓工程,这里是新建,不是刚刚Unity打出来包,按照图中提示修改。
这是修改后的样子
写入测试语句
然后选择Build Make Project开始构建,切换到Project就能看到构建出来的build文件了
找到对应的aar文件,这里包含了资源和代码一些东西,我们需要修改为zip格式,然后打开里面拿到这个classes.jar文件,然后将这个东西放入Unity工程目录的Plugins文件下
然后搭建测试UI,测试代码
然后这次直接打APK包,然后不出意外的话意外出现了- -
找到刚刚导入Unity的classes文件,修改为zip格式,进入把BuildConfig文件删除掉,这里应该是安卓版本和Unity的版本对不上,所以安卓在构建文件的时候多了个这个东西。
修改完成后记得把classes改回jar格式
重新打包,然后又报错了!!!!!!
然后又百度,说要给钥匙,就添加了一个钥匙。
然后终于成功了,放入模拟器进行运行,Perfect,然后发现运行没反应,原来是没有把场景build进去。
然后发现又报错了,提示没找到这个东西方法。
发现是这个包名要和安卓那边的一样
这样交互就成功了!
这里是演示C#调用Java那边的,如果想要在Java调用C#其实只要获取对应的API方法就可以了,有一个UnityPlayer.UnitySendMessage方法,直接拿过去用就可以了。
不过要先找到Unity安装目录的classes.jar文件,在放到安卓的位置,然后右键Add As Library添加进去就能引用到Unity封装的方法了,如果没有添加进去下面是没有这三个文件的。
了解AndroidManifest.xml文件
在我们打包的文件中还有个叫AndroidManifest的文件,其实就是配置文件,我们可以修改它里面的属性来达到我们自己的启动效果。
先搭建我们自己的安卓UI
然后创建测试脚本
再修改xml文件配置,指定启动的时候运行我们的测试脚本,主要是这个intent-filter包含的东西,将它移动到我们自己的测试语句中。
然后就是以下效果就代表成功了。
关于安卓动态请求
比如就是向手机发起是否能使用摄像机权限,这里要注意的是安卓SDK要和Unity的SDK要一致,然后要在Unity的andoridmanifest.xml添加对应的权限信息。
这里附上别人写的
(21条消息) Unity2019中的android动态申请权限(Permissions)_东方快弟的博客-CSDN博客_unity 动态申请权限
//如果没有摄像机权限,那就弹出权限提示框 if(!Permission.HasUserAuthorizedPermission(Permission.Camera)) { Permission.RequestUserPermission(Permission.Camera); }