Unity和Android混合开发

December 3rd, 2018 | XiangChen

首先介绍一下项目背景,我们公司叫胡罗舶,一家主打移动端AR/VR购物平台的公司,众所周知,涉及到AR/VR技术,业内主流都是使用插件,我们则使用高通AR插件,故而使用unity为主开发引擎也是理所当然了(为了效率)。

目前正处于AR应用阶段的后期,而且项目始终是一个带有一些社交特征的app,终究免不了社会化功能的实现,熟悉unity的应该都知道,unity的强项是在游戏领域,用unity构建app交互页面始终不大适合。而unity本身也不支持社会化功能,又考虑到各大平台sdk接入后维护的成本,只能自己自足,尝试开发插件,由此走进了unity和Android混合开发的大门。

先做一下android的简单介绍:这是一个混合开发需要理解的一个点。

在android项目中,页面就是一个个Activity,而在manifest配置文件中需要为项目设置一个入口Activity,程序真正运行起来的时候,都是先打开这个入口Activity,然后进行其他的逻辑处理。

Unity想要打包成Android项目并运行,当然也逃不脱这样的规律,一样会有Activity,一样会有manifest配置文件,这个配置文件在我们开发的时候是看不到,只有在打包的时候,会从Unity的安装目录\unity2018.1\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk下提取出来,然后与项目文件中的接入插件的manifest进行合并,得到最终的配置文件。从配置文件中就可以看到,默认情况下入口Activity是com.unity3d.player.UnityPlayerActivity,很明显,这是unity自己定义的一个Activity。

所以一般情况,一个unity项目安装到Android手机上,打开的界面都是熟悉的unity的欢迎界面。但是,现在我们知道了入口Activity是怎么设定了,我们就可以做一些不一样的东西。

通用流程是,将unity的工程导出为android项目(怎么导出?google),然后用Android Studio打开,所看到了的依然是熟悉的项目结构,一个manifest配置文件,一个UnityPlayerActivity的java文件,从配置文件中可以知道这个UnityPlayerActivity就是入口,接下来我们自己动手写一个Activity,将配置文件中的入口改成我们新写的,安装打开后,熟悉的unity欢迎界面不见了。

继续研究这个UnityPlayerActivity,它继承自Activity(废话,不然怎么当入口界面),并且有一个UnityPlayer的变量mUnityPlayer,从UnityPlayer的声明可以得出它是一个帧布局的类,所以从根本上来说unity在安卓上的表现形式就是一个封装好的View组件,而正常情况是这个View组件是布满屏幕的,但是在android项目中,我们可以改变这种形式,创建我们自己的页面布局,把unity的View组件缩小放在任何地方都可以,简直为所欲为。

说到这里基本明了了,unity的所有显示和逻辑都在这个View组件里面实现,我们只要不随意修改这个View组件就可以了,关于unity和android之间的通信,unity提供了内置的方法,浅显易懂。

由此受到启发,开发者可以考虑将依赖unity的部分放进unity中实现,其他完全可以用安卓后续实现,毕竟安卓中的屏幕刷新是被动的,这可以极大的提高程序的性能以及优化用户体验,而且很多功能实现完全可以调用安卓原生api,既方便又省性能。

AR、购物这两个关键词就注定会有大量的硬件性能消耗和网络性能消耗,这对硬件提出了很高的要求,而一个app绝不能期望用户的设备性能,所以性能优化是不可避免的,这种混合开发则避免了两者的弊端,既拥有unity对AR插件快速整合的能力,又拥有Android大量的原生可用方法以及页面丝滑交互体验,是一种目前安卓平台AR应用快速开发的理想状态。

在胡罗舶,构建AR购物平台是主旋律,这是新零售和AR结合的新兴产物,我们正致力于寻找两者中的契合点,为用户提供优良的服务和体验,作为开发者,必须改变传统的开发方式,才能获得更好的结果。

( 本文文字部分均为原创,未经授权不得转载。图片一来自网络,侵删。)