Unity作为库导入Android原生工程
1、前言
在一次项目过程中,使用unity进行了android程序的开发,但启动部分内容需要由Android Studio实现,所以只能查阅多方资料,将unity作为库导入到Android Studio中混合开发。期间查阅了许多资料,也踩了许多坑,在此做一下记录,以便后续自己参考与分享。
2、软件版本
Unity
(unity已经安装完成了OpenJDK、Android SDK&NDK Tools,具体安装步骤请查阅资料,在此不做赘述。)
Android (就是在官网上下载了目前的最新版)
3、操作步骤
①将unity程序导出
unityLibrary: unity的功能库模块 , android工程用到的重要文件夹
launcher: unity的启动器模块,包含很少的java代码
②Android Studio集成unityLibrary
1.Android Studio先New一个空项目
Empty Activity 不能选择Language,默认为Kotlin语言
Empty Views Activity 可以选择Language (新版本推荐)
注:包名不用跟Unity的包名相同
2.导入 unityLibriry模块
2.1在File中选择Import Module
等待编译后会出现报错:
解决方式:在工程级的gradle.properties文件中添加 unityStreamingAssets=.unity3d 后点右上角Try Again
若出现如下错误或警告信息:
解决方式:打开unityLibrary下的build.gradle文件,添加如下代码,点击Try Again
android {namespace 'com.android.library' }
2.2将unityLibrary模块加入到主工程app模块的module依赖
然后打开file/Project Structure - Dependencies - 选择app - 点击右侧的+号 -
选择Module Dependency
勾选unityLibrary - 点击OK
2.3修改unityLibrary下的build.gradle文件内容:
把 implementation 改为 api ,点击sync
2.4 修改主工程级的setting.gradle文件内容,点击sync
project(':unityLibrary').projectDir=new File('unityLibrary')
2.5 修改主工程级的setting.gradle文件内容,点击sync
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
//dirs './unityLibrary/libs'
}
若报错找不到路径:
将内容改为如下
2.6 修改unityLibrary下的 /src/main/AndroidManifest.xml文件,内容如下
在<activity 中增加一句: android:process="e.unity3d">
并确认android:launchMode="singleTask"的值正确,若没有,则添加此句
这两句使unity成为独立的进程,这样退出unity时不会闪退
2.7 将Launcher/src/main/res/values/strings.xml 文件拷贝进unityLibrary/src/main/res/values/里,不然编译会报错
2.8 其他配置修改
(1)修改项目级app下的strings.xml文件
增加一句: <string name="game_view_content_description"></string>
解决某些程序直接闪退的问题
运行后提示
,通过添加上面代码后可以解决
(2)在项目级app下AndroidManifest.xml application中添加
tools:replace="android:icon,android:theme,android:allowBackup"
解决合并AndroidManifest.xml文件AppTheme冲突问题
2.9 配置NDK
unityLibrary编译时会依赖 ndk 来执行il2cpp.exe 生成libil2cpp.so文件
(1)设置支持的SO库架构
注意:SDK中使用的so文件支持五种架构:
x86,x86_64,,armeabi,armeabi-v7a,arm64-v81
如果您应用中支持的架构超出这五种
请在build.gradle中使用abiFilters选择支持的架构
在项目级(app)的build.gradle文件里的defaultConfig里加入以下代码
设置支持的SO库架构 解决unityLibrary库 .so文件兼容问题
ndk {abiFilters 'arm64-v8a'}
(2)配置Android Studio ndk路径:
打开工程级下的local.properties文件,添加如下代码 ,指定ndk路径:
可以直接使用Unity的NDK,也可以使用自己下载的
app和unityLibrary都要设置NDK Version:
若电脑中没有ndk,可以在此处下载,下载完成后,ndk目录为Android SDK Location目录下的ndk文件夹
(3)修改unityLibrary 下的build.gradle文件,打开BuildIl2Cpp相关代码
注意:此处有坑,不同版本函数参数含义不同,需要仔细甄别
3.0选择Build - Make Moudle 'xxx.unityLibrary' 进行编译
若出现报错:
解决方式:根据日志信息,把unityLibrary下的AndroidMainfest.xml文件里第二行中的package="com.unity3d.player" 删除即可,再次Build不再报错
注:但是不知道删除此句会不会影响其他,目前运行打包均正常,未发现异常影响
若出现报错:
则就是ndk配置问题,找不到ndk,解决方式查看上面2.9
出现这个问题的原因是:unityLibrary编译时会依赖ndk 来执行il2cpp.exe生成libil2cpp.so文件,大概率是unityLibrary与app没有设置ndkVersion
自此,unityLibrary就全部集成完毕,Android工程app模块可以正常引用com.unity3d.player.UnityPlayerActivity
③编写MainActivity启动代码
修改app下的MainActivity.java,继承UnityPlayerActivity
④配置连接运行设备
根据需求配置,此处我选择了arm架构设备
等待安装完成后,在顶部运行按钮旁边的设备按钮就有设备了
⑤ 运行测试
5.1点击绿色三角图标,运行
5.2 等待编译、构建,成功后如下
切换到模拟器窗口,app已被安装运行
4、最后
感谢大佬的指引,根据大佬的步骤一步步配置,踩了一些坑后终于成功,Unity与原生交互之AndroidStudio篇——Unity导出Android工程,导入AndroidStudio打包APK全流程