详解Unity AR Foundation:关于AR开发你必须要知道的一切都在这里
美国福布斯杂志将Unity AR Foundation列为2019年最佳AR项目之一。作为针对中国地区的本地化服务,在最新发布的Unity中国增强版中,AR Foundation加入了本地新成员:商汤的SenseAR XR Plugin,更加完善了Unity的XR解决方案。今天我们就为大家介绍一下如何通过Unity AR Foundation来创作多种增强现实体验内容。
什么是AR Foundation?
有一个风靡全球的IP大家一定都很熟悉,那就是《愤怒的小鸟》。以下这款AR应用就是运用此IP扩展的小游戏,它在手持设备和头戴式设备都推出了应用。
大家可以看到,虽然两个视频中的AR体验,一个是通过手机,一个是通过Magic Leap,但本质上AR体验其实是很相似的。如果你进行过AR开发,你一定知道在AR开发中经常会遇到的一个问题就是:同一个AR内容,却要为不同的平台分别进行各自的开发。这里就引出了ARFoundation能够解决的一个重要问题:哪怕只是一个手持设备的AR应用,也可能要用到ARCore来为安卓设备进行构建,用ARKit来为iOS设备进行构建,然后Magic Leap和HoloLens,也都有它们自己的SDK。可以想象,如果要用每个平台本身的原生开发环境去进行AR应用的开发将会是非常繁琐的一个过程。
AR Foundation的推出贯彻了Unity一直以来的一个使命——实现“构建一次,多平台部署”。有了AR Foundation, 开发者就不用单线地一条一条地去针对每一个平台来自己解决平台差异的问题。当然,由于各个平台直接的差异很大,能够实现“构建一次,多平台部署”并非易事,下面我们会具体分享Unity AR Foundation是怎么在架构层面上解决这个问题。
这些支持不同平台的插件都是以package的形式在Package Manager里,这样各个平台公开发布一些新功能的时候,Unity能够马上通过package的形式将新增功能提供给开发者,避免了像之前那样需要下载自定义版本的Unity编辑器的麻烦。通过这种方式,为多平台的各种新功能的支持增加了一定程度的灵活性,对开发者来说也非常方便。
此外值得一提的是,随着AR行业和生态的发展,越来越多新的平台和新的设备进入到市场中,很多AR开发者也在针对这些平台进行开发。我们希望AR Foundation不仅能够支持当下的主流平台,也希望能服务于这些AR新平台的内容开发者。因此Unity当初在设计AR Foundation的架构时就考虑到了这一点,让它能够非常方便地把新的平台和设备加到支持的平台里面,其中就包括我们近期加入的商汤SenseAR。SenseAR作为本土AR解决方案的领先者,在面对复杂多变的世界局势的时候,它的加入是非常有意义的。
AR Foundation的架构
简单来说,大家可以将AR Foundation理解为对SenseAR、ARCore、ARKit这样一些底层SDK的再次封装。在不同的平台、不同的SDK下会有一些不同的功能,既使是两个完全相同的功能,但是在不同的平台下我们也可能会被封装成不同的数据结构的定义。想要开发一个可以跨平台、跨机型的AR应用是一个很难做到的事情,而AR Foundation就是为此诞生的。
那么AR Foundation是如何解决这样一个问题?我们想让开发者通过AR Foundation把更多的精力放在应用的设计和创意之上,用一套逻辑的代码,就可以开发跨平台的AR应用。为了让AR Foundation兼容各类型的底层SDK,Unity做了大量的工作,搭建了一个开放型的架构体系的平台,这个架构就是Subsystems。Subsystems是一系列功能的逻辑分组,一个Subsystems就可以当做是一个AR Foundation功能部分的C#代码。目前支持的Subsystems包括大家经常使用的平面,射线检测,锚点设置等,同时也支持一些比较新的人体追踪、手势识别,还有脸部追踪之类的功能。
通过这些简单的命名,我们可以让可能对AR或者AR Foundation完全没有概念的开发者一目了然地知道这些功能是做什么的,然后每个Subsystems之间,它们之间是互相独立的。这样设计的好处就是让开发者在开发应用的时候,在功能的组合上更加自由、丰富,更加多样性。无论是使用哪些功能或者不使用哪些功能,或者一些平台不支持想要的功能,这些情况都不会影响到已有功能的正常使用。
举个例子,有一个具有响应功能的APP,这个响应既可以通过3D的物体识别来触发,也可以通过2D的图像识别触发,但是3D的效果会更好一些。那么如果有一个平台可以支持3D物体识别,就可以通过3D识别来实现想要的功能;如果另外一个平台不支持,也没关系,退而求其次,可以使用2D的图像识别功能来开发出相同的效果。
每个Subsystems包含了三个部分:
第一部分是Unity提供给开发者,希望开发者使用的C#接口。
第二部分是对原生底层SDK的一些调用和数据的回调。
第三部分就是将前两个部分承接起来,把从原生底层拿到的数据分装成一个共享的数据,成为一个统一的数据结构,供上层的开发者调用。
下面这张图比较具象化地展现了这三部分结构。最上层的Developer Code是开发者自己写的应用代码,下一部分是AR Foundation Package,其中包含了一些Unity提供给开发者使用的API,通过Subsystem可以提供给开发者各个AR功能的使用接口和相关AR数据,可以通过GameObject来将这些数据可视化地表达出来。然后再下一层是ARSubsystems Package,这一层将每个Subsystem的功能抽象地定义出来,包括前面提到的统一数据结构和一些功能所需的方法,都是在这层所做的。通过AR Foundation就能调用这一层的内容,这样就可以不管是开发哪一个平台的APP,都可以做出来,只需去调用AR Subsystems Package所定义好的通用方法就可以。
最下面一层是Provider Package,这层就是集成比如SenseAR、ARCore、ARKit这一类的package。这一层所做的事情:一是把之前AR Subsystems Package中所定义的那些抽象方法做一个具体的实现,二是把对原生底层的SDK进行调用去获取想要的数据,第三就是把这些获取到的数据分装成ARSubsystems Package所定义过的通用数据,给上层的AR Foundation调用,然后再由用户来使用。
其中不可避免地需要处理到平台差异化的地方,这些差异化基本体现在两个方面:第一个方面就是这个平台是不是支持我当前想要用的这个功能?比如说像SenseAR的手势识别,还有ARKit的人体追踪,这些是它们自己平台独有的,别的平台暂时不支持这个功能。开发者在使用之前要先判断一下当前Runtime下的这个平台是否支持这些功能。第二个方面就是上述提过的,在各个平台上相同的功能,但是可能支持的程度不一样。举个例子,比如说像平面检测,一些平台可能支持横向和竖向的平面检测,也有一些平台可能只支持横向的平面检测。在设计APP的时候,需要针对功能的支持程度不同而做不同的处理。
对于第一个问题,可以通过目标功能提供的Manager,里面有个Subsystem这样的属性,开发者可以判断这个Subsystems是否为空,然后来确定这个平台是不是支持,为空的话就是不支持,不为空就是支持。
针对第二点,在功能的Manager里面也提供了一个叫做descriptor的这样一个参数。Plane Manager中会提供各种各样已经预设好的支持功能的参数,这个例子显示的就是它是否支持任意平面的检测,是否支持边缘点的检测,以及是否支持纵向平面及横向平面检测。通过Subsystems的descriptor,可以让开发者更好地做一些跨平台应用的开发和调整。
最后,想要提一下的是这套Subsystems的框架不仅仅运用在AR Foundation当中,很多Unity的其他功能也是基于类似的框架使用的,开发者可以通过学习封装出自己的Subsystems来进行使用。
AR Foundation支持的功能
随着近几年AR领域突飞猛进的发展,很多科技巨头都纷纷推出了自己的开发平台,比如苹果为iOS发布的ARKit,谷歌为安卓发布的ARCore,当时一下在AR界掀起了巨浪。Unity的目标是“构建一次,多平台部署”,我们也在不断推出新的版本以集成更多AR开发平台。对于Unity来说,技术持续演进,从不停歇。
2018年10月,Unity 发布 AR Foundation 1.0,支持基本AR功能,包括平面追踪、特征点云检测、参考点/锚点、设备追踪、光照估计、射线碰撞。
2019年5月,AR Foundation 2.1 支持图像追踪、物体追踪、面部追踪、环境探针。
2019年6月,AR Foundation 3.0 支持 ARKit 3.0,新增动作捕捉、人物遮挡、多人协作等功能。
2019年9月[MOU1] ,AR Foundation 支持 Magic Leap 以及 HoloLens 1 和 2 ,也增加了一些帮助XR开发加速迭代的工具,如:XR Interaction Toolkit,Unity as a Library;
2019年11月,SenseAR正式集成进了Unity中国增强版2018.4.11C版本中。
除了以跨平台方式展示AR功能的目标外,AR Foundation也做了很多优化和便利方面的工作:
高性能背景渲染:针对移动平台手持设备的(头戴设备不适用)的AR应用,需要做的第一件事情就是要将相机图像渲染为AR背景,创造一种AR的错觉。Unity利用的是与我们支持VR产品相同的高度优化的立体渲染(Stereo Rendering)。
AR内容缩放:也就是对在真实世界里要放的虚拟对象的缩放。经常使用Asset Store的开发者可能注意到大多数虚拟内容都是按人的规模缩放以供在FPS游戏中使用的。但现实情况是,AR内容的大小通常受限于可用的物理空间的大小,例如茶几上或空地板上,AR Foundation可以负责解决这些缩放问题。
优化的设备配置:这也是Unity一直的目标,希望开发者可以专注于应用体验的开发,而不用花大量时间在研究各个平台有什么不同。我们会解决这些设备的配置问题,然后在此之上进行优化,帮助大家解决例如电池寿命等性能方面的一些问题,让开发者能够更加专注于应用体验最重要的设计本身。
今后Unity将会继续更新AR Foundation,目标是更多功能匹配、缩短迭代时间以及快速内容创作。因为即时的AR体验要求响应速度非常快,以后AR Foundation也会更好地兼容DOTS,以更轻松地实现高性能的AR体验。
更好更快地支持本地开发者
在去年9月发布的中国增强版里,Unity加入了一些专门为中国开发者量身打造的性能测试工具、更接地气的远程构建工具、安全加密工具,以及Unity中国企业支持团队携手合作伙伴为本地开发者社区开发的各种新功能。想要了解更多关于中国增强版内容的小伙伴们可以戳B站视频:
https://www.bilibili.com/video/av77755584
https://www.bilibili.com/video/av88982340
https://www.bilibili.com/video/av88236133
简单来说,Unity中国增强版= Unity全球版(LTS) + 中国地区额外的增强功能通过使用Unity中国增强版,开发者不仅可以获得Unity全球版中的所有功能和更新,同时也可以得到全球版中不存在的为本地开发者而研发和优化过的新功能。而且,将中国增强版扩展到LTS以外的其他版本,以更快迭代速度以期与全球各版本同步的计划已经排上日程,意味着在不久的将来,大家可以在Unity 2019、Unity 2020版本里也使用到中国增强版的各个增强功能)。
在Unity中国增强版2018.4.11C版本中,我们首次加入了SenseAR XR Plugin Package,开发者可以直接通过中国增强版编辑器的PackageManager下载,配合AR Foundation,实现了对商汤科技SenseAR的支持。这也是Unity AR Foundation支持的第一个中国本土AR平台。
未来,Unity将会不断加强对于中国本地开发者社区的支持,陆续增加更多中国增强版的功能,为本土市场提供更好更快的服务。我们也非常愿意倾听来自社区的建议,如果你有任何针对各种功能的意见和建议,欢迎在微信文章下方留言告诉我们或者加入Unity Connect社区与我们联系。
扫码加入Unity 社区大本营
这·些·好·文,不·容·错·过