美文网首页
kotlin 应用嵌入Unity3D总结

kotlin 应用嵌入Unity3D总结

作者: 释校尉 | 来源:发表于2019-10-15 10:52 被阅读0次

     1.将Unity3D项目导出Android工程

    Unity3D项目Anroid工程文件图 工程文件src/main目录图

    将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文件进行配置

    build.gradle文件添加sourceSets

      有些机型可能加载Unity3D会报错,另需添加

    build.gradle文件添加ndk

      具体添加如下:

    build.gradle文件摘图

    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布局容器,

    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注释掉的源码

    主项目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'

    }

    如下图:

    主项目build.gradle

    第一种方法嵌入后会引发包的冲突,相同的包可以留下一个,但是app调用Unity3D的模型总会有一个UnityPlayer,调用UnityPlayer后会发现可能并不是自己想的那个样子,存在指向不明的问题,当时上面给的时间比较紧,也就把它搁置了,如有想法的,可以一同研究。(目前好像是无解的)

    (2)将游戏apk挂到项目中,让用户安装,这种方法会使项目的体积特别大,也不方便游戏的后续更新(游戏内部没有做更新操作),当然对用户来说体验不是很好,这种方法测试通过了,可以安装,可以运行;如何增强用户体验呢?如果省掉安装步骤,游戏app在手机桌面没有图标是不是感觉会好一些?为了这些想法就开始调试,查找资料,有智能安装、秒安装、静默安装等都试过了,都没有达到效果,同时隐藏掉图标后,安装会有警告提示,这就与想法冲突了。

    (3)网络下载游戏,执行正常的安装流程,用户安装了,就运行,没安装就执行下载安装,这是最后采纳的方法

    (4)还有一种方法差点忘记说了,就是Unity3D将两个模型做到一起,这样UnityPlayer不就可以很好的调用了吗!通过给Unity3D发送指令来显示哪个模型,然而测试时发现没有想象的那么好,可能Unity3D那边代码没写好,由于催的急,暂时采纳了方法3

    关于这部分的源码我抱歉不能公布,因为测试的模型需要保密,如果大家有模型又不会嵌入的,可以留言;对于一个工程项目嵌入两个或者多个模型有想法的,可以留言,一同研究。

    相关文章

      网友评论

          本文标题:kotlin 应用嵌入Unity3D总结

          本文链接:https://www.haomeiwen.com/subject/iapjmctx.html