一个 ARKit 开发者的 Unity 学习感想:Unity 会一统 AR 开发吗?

5,802 阅读9分钟

开始 Unity 学习

因工作需要,最近开始学习 Unity 平台的 AR 开发,找了很多学习资料也看了不少视频, 最后跟随知乎大神放牛的星星教程进行学习。[教程汇总+持续更新]Unity从入门到入坟——收藏这一篇就够了

其中提到了Catlike Coding的入门教程,这是我的主要学习内容,对于新手入门非常友好,讲解详细,从易到难。从 Unity 界面布局熟悉,常用操作,到 C# 语法基础讲解,框架原理都有讲到。

强大的 Unity

完成入门之后,我就不断感慨 Unity 及其生态的强大:

  • 方便的图形化界面设置:界面拖拉几下,点几个按钮,就能完成基本设置。
  • 强大的预览调试功能:多个窗口实时预览效果,Camera,x/y/z 等各个角度观看场景,还有控制台和性能参数界面。
  • 与 VS 编辑器集成:抛开 VS 宇宙第一编辑器的强大不提,保存代码后 Unity 自动更新预览,VS 的断点调试兼容,让人感觉二者有浑然一体的感觉。
  • 完整的内置组件与第三方组件:自带了常见的组件,常见 2D/3D 物体,常见材质类型/光照类型/着色器,粒子效果,拖尾效果等等。不够用的话还能方便地导入第三方组件,获得更强大的效果。
  • 丰富的内置对象类型与函数:常见几何函数,向量/矩阵/四元数互相转换与操作。

除了 Unity 在 3D 领域的强大外,它在 AR 方面也没放松,ARFoundation 的推出简化了在安卓/iOS 平台上同时开发的难度,与原本的生态集成在一起,很容易推出强大的视觉效果。而且 ARFoundation 本身也在快速更新,不断跟进 ARKit 和 ARCore 的新功能,基本不存在 AR 新功能方面拖后腿的情况。

苹果还有机会吗?

感受到 Unity 的强大之后,我不禁想到:Unity 这么强大,那以后 AR 开发岂不是直接用 Unity 好了?更好的视觉效果,同时还能跨平台,谁还会再去学 ARKit 和 ARCore 呢?苹果原生 ARKit 的优点在哪里?苹果大力推广的 AR 会甘心为别人做了嫁衣么?

我们先来梳理一下苹果的优点吧:

  • 掌握底层硬件和图形技术:A 系列芯片的 GPU 现在也是苹果自己设计,Mac 平台上目前是和 AMD 合作的,Metal 技术现在全平台支持(没错,Unity 现在也是基于 Metal);
  • 掌握 AR 配套硬件:主要指摄像头和 LiDAR,还有 U1 芯片,以及 iBeacon/WIFI/陀螺仪等室内定位与局域网通信相关硬件。苹果并不亲自制造这些硬件,但都经过深度定制或亲自设计,掌握了关键参数,有调试经验。
  • 掌握 AR 追踪与三维重建等算法:ARKit 与 RealityKit 的基础就是这些算法,这是苹果在 AR 方面最核心的技术之一。而 Unity 中 ARFoundation 是对苹果 ARKit 的再封装,替换了自己的渲染技术。
  • 有自己的软件生态和用户群:主要基于 App Store 和 iOS 平台,养成了自己的用户群体,同时积累了大量的知名软件和开发者。
  • 掌握自己的开发语言和编译器:从独占的 OC 到开源的 Swift,Xcode 编译器多年打磨,虽然稳定性一直被诟病,但好在支持全面。而且现在苹果也在搞 Reality Composer,这个对标的就是 Unity。
  • 开发框架联动:苹果的 AR 在开发中,可以方便地与自家框架集成,比如与地图框架 MapKit 集成,并形成了今年的地理定位锚点(Location Anchor),与局域网通信框架 MultipeerConnectivity 集成,可支持多人游戏等等。而 Unity 所谓的跨平台,在这时要么单独处理,iOS 一套逻辑安卓另一套逻辑,要么就不提供相关封装,由开发者自己写原生代码混编。

再看看苹果的缺点:

  • 渲染技术进度落后: ARKit 是基于 SceneKit 开发的,渲染工作全是由 SceneKit 完成的。SceneKit 虽然对 iOS 开发者来说简单易上手,但和 Unity 相比,内置功能不够多,外部第三方支持也很少,学习教程更是少得可怜。也难怪苹果要抛下 SceneKit ,在渲染方面另起炉灶,再搞出个新生的 RealityKit 出来了(其实也没有完全抛弃 SceneKit,只是不再直接继承 SceneKit,算是封闭起来改良版),但现在 RealityKit 也并不成熟,与 Unity 比仍然落后很多。
  • 缺乏 3D 图形开发界面:Xcode 在 2D 方面的 xib 和 StoryBoard 并不好用,3D 方面的 Scene Editor 也并不好用,所以又搞了 Reality Composer ,可惜现在并不成熟。
  • 傻瓜化操作,但不开源:苹果的很多框架都被高度封装,几乎是傻瓜化开发,这样的好处是可以吸引大量开发者,更好地专注于产品本身。缺点是开发大型复杂程序时,原生框架支持不够,需要自己拓展,但同时程序员水平不够也很难驾驭。Unity 是部分开源的,Unreal 是全开源的,它们的很多第三方框架也是开源了,更有利于自定义复杂功能。

说白了,苹果在各个方面都很强大,只是在 3D 图形的上层开发工具及开发生态方面不如人意。再来反观一下 Unity,发现它也是有很多缺点的:

  • 授权问题:非专业个人和小公司是可以免费使用的,但上了规模或者公司流水达到一定水平,就需要购买。另外,好一些的专业第三方也是需要收费的。免费版还有开屏 Unity 广告展示。
  • 打包太大:不管是纯 Unity 开发的 app,还是将 Unity 代码打包成 Framework 再放到 iOS 原生项目中,都会严重增大 app 包的大小,随便一个包就有 100M 左右。如果像微信这样的 app,需要一个 AR 功能,用原生 ARKit 来开发,只增加 10M 体积,但用了 Unity,可能会增加 100M 甚至 150M,这会让用户严重不满。
  • 性能较差:首先是启动慢,以我使用的 iPhone 8 Plus 为例:Unity 项目比正常的 iOS 程序启动至少要慢 2 秒,多的要慢 5~8 秒。如果是大型游戏,用户还能接受,但是普通 app 这么慢,频繁使用中完全无法接受。还有就是内存占用偏大,这点在使用过程中感受不明显,但在 iOS 平台的后台机制下,非常让人难受,因为内存占用大的更有可能被系统杀死,此时再加上启动慢,使用起来非常痛苦。另外 Unity 在低负载时,仍然会消耗大量系统资源,造成发热,续航下降等。
  • 调试困难:普通 iOS 项目,可以使用 Xcode 自带工具进行调试,断点预览SCNNode, 面包图中 SceneView 预览,GPU Debug 工具调试等,非常方便。虽然 Unity 自身也有很多调试工具,但是在 iOS 平台上,AR 项目只能跑真机测试,毕竟摄像头在手机上,这时 Unity 自身的工具就用不上了。而此时,Xcode 的工具也会使用受限,只有将 Unity 项目打包成 Framework 嵌入 Xcode 项目中时,才能使用 GPU Debug 调试,而且看到的是 Unity 的渲染管线及相关素材,和自己的代码结构完全不一样。

正常 iOS/MacOS 项目,点击照相机按钮进入GPU Frame Debugger

纯 Unity 项目,没有这个照相机按钮。作为 Framework 混编的才有

也许那些大厂如腾讯,有足够的人才、能力和经验来解决这些问题,但作为一个普通开发者,面对 Unity 的这些缺点,实在是没有太多办法。毕竟 Unity 并不是完全面向移动开发平台的项目,不可能保留自身优点的同时,又将性能优化的像原生项目一样好。

那么,面对 Unity,苹果的 AR 开发平台还有机会吗?我认为:有的。主要机会就在于:

  • 对 AR 发展方向的引领:谷歌也很强大,但早了几步成了先驱烈士,在 AR 方面苹果还是起到引领作用的,Unity 只能跟在苹果/谷歌后面不停封装;
  • 和苹果其它框架的融合:比如今年的地理定位锚点,就是和自家 MapKit 的融合,以后会不会和蓝牙 iBeacon 室内定位融合?和带 U1 芯片的设备融合?和自家带 NFC 的 App Clips 码进行融合?在这种情况下,跨平台复杂度提升,意义也逐渐淡化了。
  • 对移动平台性能的优化:苹果软硬件一体,主要精力也在移动平台,性能优化必然要好很多;
  • 降低开发者入门的门槛:任何技术的普及前提就是使用门槛的降低,AR 也是这样,苹果带来傻瓜化操作,才能吸引大量开发者,进而形成生态;

所以我觉得,在移动平台的 AR 开发方面,原生开发仍然是重点,Unity 和目前类似会集中在游戏领域。

开发者应该怎么办?

那么作为一个 AR 开发者,或者想要向 AR 方向发展的 iOS 开发者,我们该怎么办? 是看好并死守 ARKit,还是主动拥抱 Unity 大统一,哪个才是未来方向?

我个人的看法是:iOS 开发者应该先从 ARKit 入门,学习 ARKit 的 API 和向量矩阵基础知识,了解材质渲染光照等使用。

接下来就会面临一个窘境:基础 API 已经熟练了,接下来想要深入学习 Shader/Metal,却发现资料太少,难度又太大。难道就卡在这里,成为一个熟练的 API 搬运工?然后在 35 岁面临淘汰,转行送外卖?

我认为,接下来应该切换一下,尝试学习 Unity 开发:资料大把,入门也相对简单,可视化开发,及时反馈成就感高;同时 Unity 开发过程中对数学和几何的要求要稍高一些,可以帮助我们更好掌握相关算法;Unity 中使用 Shader 极其简单,讲解资料也非常多,可以帮助我们更好掌握渲染知识。

等掌握了这些知识后,再去挑战 Metal 相关内容,就会容易很多。我在掌握 ARKit 基础后,多次尝试学习 Metal,却每次都因为过于艰深枯燥而败下阵来,至今都是入门水平,花了大量精力却毫无用处,非常打击信心。

所以我觉得:不管 Unity 能不能一统 AR 开发,每一个 ARKit 开发者,都应该学习 Unity !

让我们就从 Catlike Coding 开始吧!