kotlin 应用嵌入Unity3D总结

 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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容