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全流程

Logo

纵情码海钱塘涌,杭州开发者创新动! 属于杭州的开发者社区!致力于为杭州地区的开发者提供学习、合作和成长的机会;同时也为企业交流招聘提供舞台!

更多推荐