Unity AR/VR研发最佳实践:如何避免为不同设备构建内容的痛苦
发布时间:2018-08-22 10:37 来源: 映维网
很高兴看到各种全新VR/AR技术,设备,工具包和平台的不断涌现。但对于开发者来说,这种变化将成为软件,功能和业务优先级的噩梦。
Unity开发者是如何处理这样丰富,多样化,不断变化的众多功能和服务,并与此同时实现“创建一次,构建多个”呢?在Unity选择目标平台的能力往往不够精细。Unity正在努力通过对XR播放器设置和API类的新兴支持来解决其中一些问题。但不可避免的是,开发者需要使用更高级别的工具包来满足他们在Unity项目中定位的实际设备。下图说明了开发者在应对多个SDK和高级工具包时所面临的挑战,包括预制件,非常有用的脚本组件,着色器和示例场景等等。
在Parkerhill,我们已经开发了许多VR和AR项目和演示作品,并且经历过使用不同SDK来为不同设备构建体验的痛苦。因此,我们提出了一套适合我们的最佳实践。更好的是,我们已经实施了一系列的Unity编辑器实用程序,并将其作为Parkerhill BridgeXR软件包在Unity Asset Store中发布。
一、 五个建议
1、 为player rig使用附加场景
Unity项目自然划分为不同的场景,可实施游戏的关卡。Unity同时允许你将场景加载到当前主场景。附加场景是将场景模块化地组织为单独对象层的绝佳工具。
我们通常使用附加场景来加载包含camera组件,输入设备和物理事件处理的设备特定player rig。例如,为了保持主场景独立于设备,我们可能提供一个包含SteamVR player rig的附加场景,另一个包含Daydream player rig的附加场景。然后我们编写一个场景管理器脚本,并根据实际的目标设备添加相应的player rig场景。
2、 为特定于SDK的预制件使用条件响应对象
设备SDK包括你在场景中使用的预制对象。例子包括传送舱,视频播放器,环境绘图工具,虚拟角色等等。另一个例子是,根据目标设备的不同,你可能需要模型的低多边形版本与高多边形版本,因为设备和平台之间的性能和质量要求差别很大。你的项目可以根据目标设备而选择相应版本的预制件,并在运行时进行实例化。
3、 应用条件组件以实现特定于SDK的行为
设备SDK最显著的特征之一是,存在可以添加到游戏对象中的组件脚本以实现特定的行为。一个常见例子是可交互的,具有抓取和突出显示的行为。遗憾的是,Unity不存在有条件地向对象添加组件的简单方法。
一种解决方案是将可交互对象的单独版本保存为预制件,然后使用上述条件对象技术来将正确的一个添加到场景之中。这样你将维护同一对象的完全独立版本(每个设备SDK一个),而如果你希望更改原始对象,维护问题就会出现。
Unity 2018的Variant prefab功能可以提供帮助,支持你定义从其他预制件asset派生的预制件asset。你可以将原始游戏对象作为基础预制件,然后使用添加的可交互组件来制作Variant,每个SDK一个Variant预制件。你仍然需要为每个目标设备分别使用不同的Variant预制件,但至少如果基础对象已被修改,改动将反映在每个Variant中。
在Parkerhill,我们实施了一个更好的解决方案:Refabs。从某种意义上说,Refabs是Variant Prefabs的反面。“refab”是可重复使用的组件集合(保存为预制件),可应用于任何游戏对象。它们允许你将行为与对象分开,将其作为一个或多个组件的一组,并用作游戏对象模板的组件。
Refabs的工作方式如下:将组件添加到空白游戏对象,并将其另存为预制件。可以使用Refab Loader组件将这组组件添加到任何游戏对象中。然后,场景中的对象将只有一个Refab Loader指向要使用的refab。同样可复用的组件集同样可以添加到其他游戏对象中。
4、 将特定于设备的输入事件映射到应用程序语义事件
除了player rig,预制件和对象组件之外,你还应该分离应用程序与设备相关的输入事件。对于基于画布的UI输入(如按钮),请尝试使用Unity的标准Event System。
对于更一般的对象交互(如抓取,使用和投掷),特定于设备的SDK可以直接管理用户的双手或输入控制器,光线投射和触觉反馈。
要将应用程序与SDK分离,请不要在应用程序中使用特定于工具包的事件。你应该将特定于工具包的事件映射到应用程序语义事件。语义事件是在应用程序情景中具有意义的事件。例如,你的应用程序可能只需要知道“这个对象已被抓取”,而不是响应“左手扳机键按钮已被按下”。
5、 排除SDK文件夹以避免编译器和生成冲突
当你为一个特定平台构建导入多个SDK的项目时,由于插件库之间的冲突,你可能会遇到编辑器或生成错误。你需要删除未使用的违规文件夹。解决方法是重命名带波形符的文件夹(“FolderName~”),这样Unity就会忽略它。
二、 Parkerhill BridgeXR工具包
通过分离应用程序与任何一个特定SDK,上述五条建议在令应用程序独立于设备方面可以提供巨大的帮助。这涉及一定的工作,但可以手动完成。幸运的是,Parkerhill提供了一个帮助你管理的工具。
用于Unity的Parkerhill BridgeXR插件包含一组编辑器内实用程序,支持上面列出的五种最佳实践,如下所示:
Scene Bridg:根据当前活动设备标识符(Bridge ID),有选择地将附加场景加载到当前场景。适用于要包含在场景中的player rig和其他特定于设备的对象层。
Prefab Bridge:根据当前活动的Bridge ID,有选择地在场景中的生成点实例化Game Object预制件。当你为不同设备使用相似但不同的预制件时使用它,如传送点和视频播放器等等。
Component Bridge :当你为每个目标设备使用定义复杂行为的不同组件集时,使用Component Bridge。它可以根据当前活动的Bridge ID并有选择地将一个或多个Unity组件添加到游戏对象。Component Bridge基于Parkerhill Refab实用程序,是使用特定于SDK的组件来实施常见行为的强大工具。
Input Event Mapping:使用BridgeXR的事件发送器组件和接收方组件来将核心应用程序映射至特定于应用程序的语义事件,从而分离核心应用程序和特定于设备的SDK输入事件。
Folder Exclusions:编辑器内工具,可支持你在定位一台或另一台设备时排除特定文件夹。
每个实用程序都有自己的优点。当结合起来时,它们提供了一种在Unity项目中构建独立于设备层的方法。BridgeXR可帮助你在单个项目中管理多个SDK,没有版本控制或其他不令人满意的任务。
无论是自行操作,还是借助Parkerhill BridgeXR这样的Unity实用程序,上述技巧可以帮助你继续使用自己熟悉和信任的高级工具包,利用来自优秀VR和AR供应商的软件,并避免可能影响你开发的大部分VR和AR工具包SDK碎片化情形。
推荐阅读