Notifications
Article
Unity VR/AR项目优化技巧与工具
Published 2 months ago
69
0
如今,各种新型虚拟现实VR和增强现实AR的技术、设备、工具包和平台不断涌现。但对于开发人员而言,这样的变化会在处理软件、功能和业务优先级时产生负担。Unity开发人员在处理丰富多样,不断变化的大量功能和服务,同时应该如何实现“一次开发,多次构建”呢?
本文是沉浸式媒体开发公司Parkerhill Reality Labs的白皮书《Best Practices for Multi-Device VR/AR Development》的简略版本,将分享5个Unity VR/AR项目多设备优化技巧和工具。

项目难题

Unity中选择目标平台的功能往往不够精细,Unity正努力通过为XR播放器设置和API类提供更多支持来解决该问题。但不可避免的是,开发人员需要使用一些更高级别的工具包来处理他们在Unity项目中指向的实际设备。
下图说明了开发人员在选取多个SDK和高级工具包时所面临的难题,这类工具包中包含玩家绑定、预制件、实用脚本组件、着色器和示例场景等内容。

优化工具

在Parkerhill Reality Labs,我们开发了许多VR和AR的项目和演示,体验过使用不同SDK对各种不同设备进行构建的痛苦。因此,我们总结出了一些最佳实践技巧。而且,我们还实现了一系列Unity编辑器内的实用工具,它们能方便地实现这些设计模式,我们把这些工具的资源包成为Parkerhill BridgeXR。
下载Parkerhill BridgeXR,请访问Asset Store资源商店:
https://assetstore.unity.com/packages/tools/utilities/bridgexr-116811

优化技巧

1.为玩家绑定使用附加场景

Unity项目通常分为多个场景,用于实现游戏关卡。Unity允许用户在当前主场景附加载入场景。附加场景能够将场景模块化地组织为单独的对象层级,它是一个优秀的工具,。
我们通常使用附加场景来载入设备的特定玩家绑定,包含摄像机组件、输入设备和物理事件控件。为了保持主场景独立于设备,我们可能会同时使用带有SteamVR玩家绑定的附加场景和带有Daydream玩家绑定的附加场景。然后编写场景管理器脚本,当应用启动时,该脚本会根据实际目标设备来添加对应玩家绑定场景。

2.为SDK特定预制件使用条件对象

设备SDK包含预制件对象,可用于在场景中实现各种功能。示例包含:传送舱、视频播放器、环境绘图工具和Avatar等。
另一个示例,根据目标设备的不同特点,你或许想要拥有同一模型的低多边形和高多边形版本,因为不同设备和平台上的性能和质量需求不同。项目可以根据目标设备使用合适版本的预制件,预制件会在运行时实例化。

3.使用条件组件来实现SDK特定行为

设备SDK最特别功能是为游戏对象添加组件脚本来实现特定行为。例如:通常可交互对象会有抓取和突出显示的行为。然而在Unity中,根据条件给对象添加组件的功能没有简单的实现方法。
一种解决方法是将可交互对象的独立版本保存为预制件,然后使用上文中的条件对象方法来给场景添加正确的预制件。该方法能够完全保留同一对象的独立版本,因为每个设备SDK有一个相应的预制件。但是,如果你想修改原始对象则会带来维护问题。
Unity 2018引入了全新的预制件变体(Variant Prefabs)功能,它允许你定义从其它预制件资源衍生的预制件资源。你可以将原始游戏对象作为基础预制件,然后添加可交互组件制作变体,每个SDK都有一个相应预制件变体。最后你同样会得到每个目标设备相应的预制件变体,但是不同的是,对基础对象进行的改动也会影响变体。
我们实现了一个更好的解决方案,称为Refab。 从某种意义上说,Refab与Variant Prefabs是相反的。Refab是一个可重用的组件集合,保存为预制件,可用于任何游戏对象。它们允许你将行为和对象分开,作为一个或多个用作游戏对象模板的组件。
Refab的工作方式如下:添加组件到空白游戏对象上,将其保存为预制件。可以通过Refab Loader组件将这组组件添加到任何游戏对象中。然后,场景中的对象会拥有Refab Loader组件来指向所使用的Refab,而不是SDK的特定组件。相同的可重用组件集也可以添加到其它游戏对象。
下面是Refabs for Unity演示示例。

4.将设备特定输入事件映射为应用程序语义事件

除了玩家绑定、预制件和对象组件之外,你还应该将应用程序和设备特定输入事件分离。对于基于画布的UI输入,例如按钮,请尝试使用Unity的标准事件系统。
对于常见的对象交互,例如:抓取或投掷,设备特定SDK会直接管理用户手势或输入控制器、光线投射和触觉反馈。
为了将应用程序和SDK分离,请不要在应用程序中使用工具包特定事件。你应该将工具包特定事件映射为应用程序语义事件。语义事件(Semantic Event)是在应用程序上下文中有意义的事件。例如:你的应用程序或许只知道“该对象已被抓取”的意思,但无法对“按下左手触发器按钮”做出反应。

5.排除SDK文件夹以避免编译器和版本冲突

当构建针对特定平台导入了多个SDK的项目时,你或许会遇到编辑器或版本错误,这是因为插件库中存在冲突。此时需要删除未使用的冲突文件夹。还有一个解决方法是在名称后加入波浪号,例如:FolderName~,这样Unity就会无视该文件夹。

BridgeXR

通过使用以上五个技巧,你可以将应用程序从特定SDK中分离出来,使之独立于设备。应用这些技巧需要一些操作,但它们完全可以手动完成。而且,你还可以使用BridgeXR工具包进行更好的管理。
BridgeXR工具包包含一系列编辑器内的实用工具,支持上文5个最佳实践技巧,功能如下:
Scene Bridge :可以根据当前活动的设备识别码,即Bridge ID,便捷地为当前场景选择性加载附加场景。当你将玩家绑定和其它设备特定对象层级加入场景时,该工具可以发挥很大作用。
Prefab Bridge:该工具可以基于当前活动的Bridge ID,在场景出生点选择性地实例化游戏对象预制件。当你拥有外形相似但是用于不同设备的不同预制件时,就可以使用该工具来处理,这类预制件包括传送点、视频播放器和细节层级对象。
Component Bridge :当你拥有根据目标设备定义复杂行为的不同组件集时,可以使用Component Bridge根据当前活动Bridge ID,选择性地添加一个或多个Unity组件到游戏对象。Component Bridges基于Refab实用功能开发,它是个为SDK特定组件实现常见行为的强大工具。
Input Event Mapping:它可以通过使用BridgeXR的事件发送器和接收器组件,将事件映射为应用程序特定语义事件,从而把核心应用程序和设备特定SDK输入事件分离。
Folder Exclusions:Folder Exclusions是一个编辑器内的工具,能让你在指向目标设备进行构建时,将特定文件夹从版本中排除。
在单独使用时,这些工具能发挥各自的作用。在结合使用时,它们将提供方法为你的Unity项目构建独立于设备的层。BridgeXR将帮助你管理项目中的多个SDK,而且不用处理版本控制分支或其它任务。

小结

无论你是自己实现工具,还是使用BridgeXR这类实用工具,通过利用这些技巧,你可以继续使用自己了解和信赖的高级工具包,利用VR和AR主流供应商的优秀软件,并避免VR和AR工具SDK的分化对开发过程产生的影响。

Unity China
379
Comments