美文网首页
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