今天,公司做的第一款AR项目终于在苹果appstore上架了。将近三个多月的踩坑和摸索也终于告一段落了,接下来就是不断的进行版本优化和更新,这将是一个漫长的过程。在此,对自己三个多月的开发做一个阶段性的总结,也希望能够帮到一些正在用unity开发AR应用的朋友。
开发环境:
因为考虑到后期IOS打包的问题,为了避免尽量少出错,基本所有的开发全在一部21寸的IMAC上,用的自然是OSX系统(不能用VS真的好痛苦啊)。
暂时只能配置了VSCode进行脚本的编写(想要用unity3d代码补全功能,除了官网所需要安装的插件之外 还需要brew install mono)。
unity版本最初使用的是5.3.4版本,后来升级成了5.3.6版本,原因会在后面详述。高通SDK 也就是Vuforia用的版本是vuforia-unity-5-5-9(截止目前为止 最新的版本在6.0以上)。
安卓打包环境通过下载android studio轻松配置完毕。Xcode从7.3版-8.0版本。
学习:
之前从未接触过任何有关于AR开发的领域 ,只是隐约记得unity可以用来开发AR应用。这里建议各位AR开发者一定要下载ARSDK提供商的开发案例,直接看官方所提供的应用案例源码无疑是学习的最佳入口。由于Vuforia封装了上层的AR实现源码,将其打包成了DLL,开发者只要实现相对应的接口即可,并不需要过多的深入AR底层,对于底层比较感兴趣的朋友可以去github上搜寻AR底层实现的源代码,当然至今效果最好的还是高通的SDK,只是暂时看不到源码,无法深入学习。
遇坑:
1.AR识别后的模型物体出现不稳定的情况,这一点实际上跟AR识别图有很大的关系,识别图的明暗对比,材质都将对此产生影响。一定要记得将画好的识别图上传到高通的开发中心,高通提供了对识别图的图集打包和识别图的识别点的显示。识别点越多,识别图越容易被显示,相应的识别星级也就越高。
2.现在我的项目中模型摆放的方式是:在场景中摆入所要识别的imagertarget(有多少张就必须在场景中放多少个imagertarget,动态加载是没用的),将所要识别的模型作为子物体分别放在相应的imagertarget下,只要识别图一旦被识别 就会连同模型一起被激活显示,跃然纸上。一开始这种方式是非常好的,但却有一个致命的缺陷,因为要在场景中要摆放所有的模型,那么进入该场景时,就会占用大量的内存(因为要加载场景中所有的模型),这样移动端的配置越低进入的时间就越长,普遍在15秒以上,用户体验非常的不好。这是在项目的后期才发现的 ,为时已晚,不由有些遗憾。而一个我想到一个正确的思路是没必要将模型放在场景中,而是在imagertarget被识别时,以Resource的方式加载模型进场景中,并跟踪imagertarget的位置信息,然后以对象池的方式管理这些模型。这样在进入场景时,就不会因为加载过慢 影响用户体验。
3.每个模型被识别后都会在UI上显示对应的名字(儿童百科全书~)还会播放对应的读音。对此,我才用json配表的方式做了一个对应的配置加载类。所有的数据只需要添表即可。当然,这样每个模型上都必须手动给予一个对应的数据加载唯一标识数。因为模型只有99个,故而用手动的方式给予还算方便,也许还有更好的方式,我暂时没想到。
4.AR模型在多图识别的情况,会出现角度偏移的情况,这个问题非常让人抓狂,经过无数次的debug发现根本不是模型本身出现了角度偏移,而是父物体imagertarget出现了角度偏移,故而只需要在每次失去识别的事件接口中将其复位至原始位置即可。
5.应用中接入了语音识别sdk,很不巧的发现unity5.3.4的一个bug,那便是调用麦克风识别之后,场景中的所有声音全部失效,再也没有任何的声音。这点唯独在unity5.3.4版本下有这样的bug,升级至5.3.6版本后就得以解决。
6.在代码构造上,说实话实在过于凌乱,一方面是因为自己实在是经验不足,对逻辑的把控十分不清,因此在此阶段恶补了面向对象的编程思想和设计模式,才发现自己写的代码实在太难看了,难以扩展和修改,不过好在项目正常的运行起来,希望在将来能将代码构造的更加干净,写出真正优雅的代码。
2016.11.24更新
7.IOS手机屏幕的边框地带出现了诡异的残影,一开始以为是opengles的问题,试过切换图形库结果还是不行,最后发现是AR摄像机的刷新设置为根据深度进行刷新,后来设为soild color 黑色后 就一切正常了,完美解决。