1.将Unity3D项目导出Android工程
将Unity3D嵌入Android,只需要libs文件夹中jar文件、src/main目录下的assets文件、jniLibs文件
注:后面介绍将Unity3D导出的Android工程文件称作UAndroid,
2.文件导入
(1)将上文提到的libs文件中的文件对照Android目录对应添加
(2)将上文提到的src/main/assets文件中的文件对照Android目录对应添加
(3)将上文提到的src/main/jniLibs文件中的文件对照Android目录对应添加
注:kotlin项目中没有目录就创建目录(非UAndroid)
3.配置
(1)导入的jar文件要引用,选中导入的jar文件,右键Jar包,选择Add As Library
(2)kotlin项目的app->build.gradle文件进行配置
有些机型可能加载Unity3D会报错,另需添加
具体添加如下:
4.运用
(1)kotlin activity中
private var mUnityPlayer: UnityPlayer? = null
override fun onCreate(savedInstanceState:Bundle?) {
//初始化Unity3D
mUnityPlayer = UnityPlayer(this)
val glesMode = mUnityPlayer!!.settings.getInt("gles-mode",1)
mUnityPlayer!!.init(glesMode,false)
DataConstant.DataItem.mUnityView = mUnityPlayer!!.view //全局变量
}
override fun onDestroy() {
super.onDestroy()
mUnityPlayer!!.quit()
}
override fun onResume() {
super.onResume()
mUnityPlayer!!.resume()
}
override fun onPause() {
super.onPause()
mUnityPlayer!!.pause()
}
override fun onConfigurationChanged(newConfig: Configuration) {
mUnityPlayer!!.configurationChanged(newConfig)
super.onConfigurationChanged(newConfig)
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
mUnityPlayer!!.windowFocusChanged(hasFocus)
super.onWindowFocusChanged(hasFocus)
}
@Suppress("DEPRECATED_IDENTITY_EQUALS")
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
return if (event.action === KeyEvent.ACTION_MULTIPLE)
mUnityPlayer!!.onKeyMultiple(event.keyCode, event.repeatCount, event)
else super.dispatchKeyEvent(event)
}
(2)fragment中添加Unity3D视图
//布局添加Unity3D
val playerView = DataConstant.DataItem.mUnityView //unity3D全局变量
playerView!!.isFocusable = true
playerView.requestFocus()
frameUnityView.addView(playerView)
frameUnityView是layout布局容器,
最近更新混淆,如果有更好的方法,欢迎交流
-ignorewarnings
-libraryjars libs/unity-classes.jar
-dontwarn com.unity3d.player.**
-keep class com.unity3d.player.**{*;}
-dontwarn bitter.jnibridge.**
-keep class bitter.jnibridge.**{*;}
-dontwarn org.fmod.**
-keep class org.fmod.**{*;}
公司最近想结合产品做个游戏,游戏同样使用Unity3D开发,游戏也要嵌入到App中,App原来就有一个Unity3D的模型,嵌入后就会有两个Unity3D的模型,两个Unity3D的模型在同一个项目中会不会引发包冲突呢?那是肯定的。
嵌入的方法(也就是嵌入的想法)如下:
(1)将Unity3D以module模块嵌入,这种嵌入方法网上有很多,就是将Unity3D导出的Android工程作为nodule导入,修改一些参数,比如注释掉manifest的一些
主项目manifest 中添加xmlns:tools="http://schemas.android.com/tools"
application 中添加tools:replace="android:icon,android:theme,android:allowBackup"
Unity3D module的build.gradle中修改
1. apply plugin: 'com.android.application' 为 apply plugin:'com.android.library'
2.将依赖的库,minSdkVersion 最好改成与主项目一致,防止出错
3.如果有.aar文件的,可以放在主项目中的libs文件夹下,主项目app 的build.gradle 中添加引用(
implementation(name:'UnityChannel',ext:'aar')
),同时 android 添加如下代码:
ourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
}
4.在工程项目build.gradle中添加
flatDir{
dirs'libs'
}
如下图:
第一种方法嵌入后会引发包的冲突,相同的包可以留下一个,但是app调用Unity3D的模型总会有一个UnityPlayer,调用UnityPlayer后会发现可能并不是自己想的那个样子,存在指向不明的问题,当时上面给的时间比较紧,也就把它搁置了,如有想法的,可以一同研究。(目前好像是无解的)
(2)将游戏apk挂到项目中,让用户安装,这种方法会使项目的体积特别大,也不方便游戏的后续更新(游戏内部没有做更新操作),当然对用户来说体验不是很好,这种方法测试通过了,可以安装,可以运行;如何增强用户体验呢?如果省掉安装步骤,游戏app在手机桌面没有图标是不是感觉会好一些?为了这些想法就开始调试,查找资料,有智能安装、秒安装、静默安装等都试过了,都没有达到效果,同时隐藏掉图标后,安装会有警告提示,这就与想法冲突了。
(3)网络下载游戏,执行正常的安装流程,用户安装了,就运行,没安装就执行下载安装,这是最后采纳的方法
(4)还有一种方法差点忘记说了,就是Unity3D将两个模型做到一起,这样UnityPlayer不就可以很好的调用了吗!通过给Unity3D发送指令来显示哪个模型,然而测试时发现没有想象的那么好,可能Unity3D那边代码没写好,由于催的急,暂时采纳了方法3
关于这部分的源码我抱歉不能公布,因为测试的模型需要保密,如果大家有模型又不会嵌入的,可以留言;对于一个工程项目嵌入两个或者多个模型有想法的,可以留言,一同研究。