简介
最近这段时间公司内闷着头想把Unity干入Native项目,早在16年初的时候,那时候也是闲的蛋疼,曾经跑通了安卓和iOS的Unity做为库集成到Native项目的流程,后来加入新公司,又基于2018版的Unity集成过一次,iOS用PBX脚本方式集成的,Android是自己写的Copy脚本完成的,最近发现2019.3Unity已经完美支持了Unity as a Library,所以尝试了一下,里面还是又很多坑,不过磨磨时间都是可以FIX的。
官方文档环境依赖
- Android Studio `3.3.2+`
- Unity version `2019.3.a2+`
实操环境
- Android Studio `3.5.3`
- Unity version `2019.3.1f1`
操作步骤
Step.1
- Android Studio 新建项目,如下图:
- Unity 新建项目(无论Windows用户还是Mac用户都建议安装HUB),如下图:
- 最终工程结构如下:
Step.2
- 通过 Unity 打开 UnityProject
- 选择 File -> Build Settings -> Switch Android Platform -> Export Project 注意事项如下图:
- 在导出工程之前还有一个关键的地方需要设置,否则会在最终 Native 项目引入时无法编译,如下图(选择IL2CPP和ARM64):
- 并没有结束,因为你选择了IL2CPP,特别是NDK按照提示你的报错安装就可以(版本要求比较高)
- 可以点击Export了,注意路径选择,当然你也可以自由先泽,建议按照官方来,如下
Step.3
- 通过 Android Studio 打开 NativeAndroidApp
- 选择 setting.gradle 文件添加 unityLibrary module
include ':unityLibrary'
project(':unityLibrary').projectDir = new File('..\\UnityProject\\androidBuild\\unityLibrary')
- 选择 build.gradle(Module:app)添加 dependencies
dependencies {
implementation project(':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
// 自己项目的配置
}
- 选择 build.gradle(Module:NativeAndroidApp)
allprojects {
repositories {
google()
jcenter()
// Add Code
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
// End
}
}
- 选择 NativeAndroidApp 的 strings.xml 添加(这个是个坑,官方也没有指出来)
<resources>
<string name="app_name">NativeAndroidApp</string>
<string name="action_settings">Settings</string>
// Add Code
<string name="game_view_content_description">Game view</string>
// End
</resources>
解决方案事例
限制(谁有新发现可补充或者移除)
- 以库形式使用的Unity仅支持全屏渲染,不支持在屏幕的一部分进行渲染;
- 不支持加载多个Unity运行时实例,Unity可选择附着与当前App的进程,也可以另启一个进程(目前仅限于Android);
- 开发者需要调整第三方插件,包括原生插件和托管插件,目前我们做VR App就遇到了这种窘妆,库支持堪忧;
- 生命周期事件的感知(目前最新版本已经添加了部分事件);
包体(粗略计算)
Android 空工程包体如下 2.2M:
Unity IL2CPP ARM64 & V7a 空工程包体如下 9.87M & 9.12M:
Unity Into Android 空工程包体如下 22.9M:
性能 - 内存
跑在同一进程(资源不能完全释放)
跑在不同进程(资源可以完全释放)
消息传递(用例后续有时间补齐)
- 传统数据交换 - 函数传参 - 支持
- 数据指针交换 - 推拉流数据 - 支持
- 共享纹理 - 相机采集数据 - 支持
- C++ 直接交互 - 底层库 - 支持
安卓 & U3D 交互
- [AAR plug-ins and Android Libraries](AAR plug-ins and Android Libraries)
- [JAR plug-ins](Unity - Manual: JAR plug-ins)
- [Extending the UnityPlayerActivity Code](Extending the UnityPlayerActivity Java Code)
- [Native (C++) plug-ins](Native (C++) plug-ins for Android)
- [Using Java and Kotlin source files as plug-ins](https://docs.unity3d.com/Manual/AndroidJavaSourcePlugin)
官方文档(有部分坑,建议按照上面的流程操作)
- [Unity as a Library](Using Unity as a Library in other applications)
- [Unity into Android API](Integrating Unity into Android applications)
- [Unity into Android Step Details](Integration Unity as a library in native Android app)