当前位置: 首页 > java >正文

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

http://www.xdnf.cn/news/18153.html

相关文章:

  • 【github-action 如何为github action设置secrets/environment】
  • SpringAI集成MCP
  • (Arxiv-2025)OPENS2V-NEXUS:一个面向主体到视频生成的详细基准与百万规模数据集
  • 【完整源码+数据集+部署教程】织物缺陷检测系统源码和数据集:改进yolo11-RevCol
  • [数据结构] ArrayList 与 顺序表
  • 【前端进阶】UI渲染优化 - 骨架屏技术详解与多框架实现方案
  • RH134 管理网络安全知识点
  • CMake指令:查找文件(find_file)、查找目录(find_path)、查找库文件(find_library)
  • ANSI终端色彩控制知识散播(I):语法封装(Python)——《彩色终端》诗评
  • 图论Day5学习心得
  • 【运维进阶】LNMP + WordPress 自动化部署实验
  • 《Image Classification with Classic and Deep Learning Techniques》复现
  • [Code Analysis] docs | Web应用前端
  • 深度学习-计算机视觉-微调 Fine-tune
  • 学习游戏制作记录(各种独特物品效果)8.18
  • 机器学习-决策树:从原理到实战的机器学习入门指南
  • AI大模型实战:用自然语言处理技术高效处理日常琐事
  • 嵌入式设备Lwip协议栈实现功能
  • 【软考架构】第4章 密钥管理技术和访问控制及数字签名技术
  • 【前端】使用Vue3过程中遇到加载无效设置点击方法提示不存在的情况,原来是少加了一个属性
  • 【大模型】RAG
  • 8.19 note
  • 云原生俱乐部-mysql知识点归纳(1)
  • cesium中实时获取鼠标精确坐标和高度
  • Vue深入组件:组件事件详解1
  • Laravel中如何使用php-casbin
  • OSCP - Proving Grounds - Vanity
  • 云计算核心技术之容器技术
  • SAP 数据脱敏工具:SNP TDO如何满足新颁敏感信息政策要求
  • 【C语言篇】操作符详解