使用 Unity MARS
本页描述如何使用代理、代理组和 复制器,以及如何使用比较工具来评估良好匹配内容的融合方式。此外,还包含关于使用 MARS 来创作 AR 内容的提示。本页的结构类似于一系列动手操作的微型教程。
本页涵盖以下 Unity MARS 工作流程:
将数字内容放置在桌子上
可以使用 MARS 模板将数字内容快速放置在桌子上。从 Unity 的主菜单中选择 Window > MARS > Choose Template,然后选择 Tabletop 模板。这将打开一个模板场景,其中包含实现简单桌面场景所需的所有元素,然后需要另外保存场景(菜单:File > Save As)。
在场景的 Hierarchy 中,查找 Table 元素。这是具有条件的代理,根据相应条件使这个代理与 0.5x0.5 米(约 2.25 平方英尺)或更大的平面匹配。您的应用程序在现实世界中找到匹配的数据时,列示为该代理的子项的所有游戏对象都会激活。
默认情况下会将立方体设置为显示在表面上。您应该将立方体移除,并将其替换为自己的内容。
可以将预制件直接放置在此元素下,也可以将预制件拖动到场景中间的平面上。平面是上述 Table 元素的抽象表示。您的游戏对象与 Table 元素的中心之间的任何本地位置偏移都将以绝对单位(而不是以偏移值相对于现实表面大小的百分比)保持不变。
注意:大多数 AR 设备尚不支持对象识别。有些平坦表面可能会注册为适合于桌面内容,但这些平坦表面不是桌子,例如沙发或椅子。可以在模拟模式(菜单:Window > MARS > Simulation View)中测试您的应用程序以查看其针对现实数据的行为方式,以及如何调整条件以改善适应度。
从头开始创建代理
可从头开始创建代理,而不使用模板。为此,请从 Unity 的主菜单中选择 GameObject > MARS > Proxy。这样会在场景中创建一个空代理。
一个新的(空)代理包含一些默认操作和条件。该代理希望所匹配的数据具有位置和方向,然后根据是否找到匹配项来显示或隐藏其子游戏对象。要使代理匹配任何类型的平面,请向其添加新条件。单击 Inspector 中的 Add MARS Component 按钮,然后选择 Condition > Trait > Plane。
现在,代理可以针对世界中发现的任何单个表面进行匹配。
将内容附加到代理
在 Hierarchy 视图中,您可以将预制件、网格或资源作为已创建的代理的子游戏对象来进行拖放。将游戏对象拖动到代理可视化图形上时,该可视化图形将突出显示,并显示带有其名称的工具提示。释放游戏对象时,Unity MARS 在 Hierarchy 视图中将资源添加为代理的子项。
注意:MARS 会保留资源的本地位置偏移量。如果您希望资源显示在检测到的表面的中心,请将其本地位置设置为 (0, 0, 0)。
从模拟数据自动创建代理(创建工具)
借助创建工具可以从 Simulation View 中采样数据,并自动使用描述采样数据的条件来创建代理。
有关更多信息,请参阅创建工具文档。
针对模拟数据来调试代理(比较工具)
借助比较工具可以检查 Unity MARS 如何根据 Simulation View 中的数据对代理进行评估。
有关更多信息,请参阅比较工具文档。
将代理与世界的 Y(向上)轴对齐
代理找到匹配项后,Set Pose Action 将移动其变换组件的位置和旋转以使其与数据的姿态对齐。
如果匹配数据是垂直平面,则启用 Align with World Up 选项以使内容具有一致的垂直方向可能很有用。该选项有三种不同模式:
- 无:(默认)代理直接匹配数据的姿态。姿态数据的旋转取决于数据提供程序。
- Y:代理的本地 Y 轴(向上)始终与世界的“向上”方向对齐。
- Z:代理的本地 Z 轴(向前)始终与世界的“向上”方向对齐。
该模式设置为将 Y 或 Z 对齐到“向上”方向时,另一个轴始终垂直于世界的“向上”方向并向数据的“向上”方向对齐。如果数据的“向上”方向与世界“向上”方向平行,它会回退到数据的“向前”方向。
使用复制器将内容置于多个表面上
每个代理都代表一个与现实数据的精确匹配项。但是,也可以在查询的每个匹配项上生成内容。例如,您可能想在应用程序检测到的每个水平平面上生成草地。为此,可以使用复制器。
要使用复制器,请按以下步骤操作:
按照上面从头开始创建代理部分中概述的方法来创建代理。
创建复制器游戏对象:单击 MARS Panel 中的 Replicator 按钮,或者从 Unity 主菜单中选择 GameObject > MARS > Replicator。
选择该游戏对象。在其 Inspector 窗口中,您可以在 Max Instances 属性中设置您的应用程序支持的匹配项实例数量,以及通过设置启用或禁用 Spawn As Child 属性将它们创建为复制器的子项或其同级对象。Max Instances 的值为 0 表示对实例数量没有限制。
移动您的代理以作为复制器的子项。
创建代理组
前面的部分描述了如何处理单个代理 - 即现实世界特征的单个集合。Unity MARS 还提供一个称为代理组的功能,该功能使您可以将多个代理关联在一起。
代理组遵循与单个代理相同的模式。代理组包含用于寻址或定位它们的关系,以及在匹配或更新代理组时调用脚本的操作。不同之处在于,关系脚本引用多个代理而不是单个代理。
代理组具有以下结构:
游戏对象 (代理组) (关系)
-子游戏对象 (代理) (条件)
-子游戏对象 (代理) (条件)
-...
该代理组可用的子游戏对象列表显示在该组的 Inspector 中。要表明 Unity MARS 必须有子游戏对象,请在 Required Children 列表中选中该子游戏对象旁边的框。MARS 使用不必需的子游戏对象来查找代理组。一旦发生这种情况,即使丢失或移除这些子游戏对象,代理组也不会丢失其数据。
可通过三种方式来创建代理组:
- 单击 MARS Panel 上的 Proxy Group 按钮。
- 从 Unity 的主菜单中,选择 GameObject > MARS > Proxy Group。 *向新游戏对象添加 ProxyGroup 组件。
所有这些方法都会创建具有一个代理组和两个代理子游戏对象的游戏对象。要添加关系,请单击代理组的 Inspector 中的 Add MARS Component 按钮,然后选择 Relation 并从菜单中选择关系类型。
也可以将代理组放在复制器中。这将为该代理组创建多个匹配的实例。
以世界比例来缩放 AR 内容
由于浮点精度,Unity Editor 在现实对象比例(1 单位 = 1 米)中性能最佳。缩放内容以实现“微型世界”的行为并不能解决重力、光照、物理、AI 等方面的影响。这些系统仍按正常比例运行。
Unity MARS 使用一种称为“世界比例”的概念;该概念使您可以按现实比例开发内容并以微型比例显示它。您可以在 MARS Session Inspector 中,为当前场景调整世界比例。通常,MARS 对真实大小的 AR 使用 1:1 的比例,对于桌面微缩模型使用 1:10 的比例。
注意:Unity MARS 当前不支持微型缩放的游戏对象和真实缩放的游戏对象的组合。
为了达到世界比例效果,请使游戏对象保持其“真实”大小,然后修改摄像机偏移量,以使物理系统(例如物理、粒子和光照)继续按预期运行。有关更多信息,请参阅 Unity 博客中的处理 AR 中的比例 (Dealing With Scale in AR) 以及 Unity 的 GDC 大会 AR 快速讨论 (AR Lightning Talks at GDC)。
场景评估
有两种方法可控制 Unity MARS 何时为您的场景评估匹配项。要选择 MARS 以哪种模式启动,请查看 EvaluationSchedulerModule 资源并设置 Startup Mode 选项:
- EvaluateOnInterval:默认情况下,MARS 尝试按固定时间间隔对场景进行解算(您可以在 EvaluationSchedulerModule 的 Evaluation Interval 字段中输入该时间间隔)。
- WaitForRequest:在此模式下,MARS 不会在收到此类请求之前评估场景的匹配项。
EvaluationSchedulerModule 资源的 Minimum Evaluation Time 字段控制两次评估之间必须经过的最短时间。使用该字段可以防止您的应用程序发送垃圾评估请求而导致每帧运行一次场景评估。将此字段设置为 0 可以使两次评估之间没有任何间隔时间。
基于人工合成数据来放置内容
在本页的上一节中,您学习了将游戏对象附加到符合条件的代理。人工合成数据提供额外的灵活性,例如相互比较代理。Unity MARS 基于查询来创建人工合成数据,这些数据将返回到数据库。您可以查询人工合成数据语义标签,以及向其添加更多条件。
例如,如果您要制作 AR 游戏,可以使用复制器来定义一些放置敌人的基本条件,但是您可能希望在玩家角色的生成点附近生成较弱版本的敌人。如果您向英雄复制器和敌人复制器人工合成数据添加“player_spawn”和“enemy_spawn”语义标签,还可以在复制器上添加距离条件以确定是否生成较弱的敌人。
关于使用 Unity MARS 来创作 AR 内容的提示
您可能想考虑与您在 Simulation View 中看到的轴匹配的表面,但是在现实世界中,您不能依赖于严格的方向。通常,来自 AR 设备的平面具有相当随机的偏航旋转,尤其是对于非矩形的表面。
通常,制作能够适应世界的内容胜于限制可以使用您的内容的情况。Unity MARS 甚至无法将理想的环境扫描为完美的轴对齐直线平面。使您的内容具有适应性是确保其正常运行的最佳方法。
不要惧怕围绕设备无法直接提供的抽象概念或其他数据类型来进行设计。如果您的应用程序需要沙发,那么请让您的代理具有需要“沙发”语义标签的条件。在开发过程中,这使您可以在 Simulation View 中模拟此体验,允许您在其中手动标记环境内容。在构建应用程序时,Unity MARS 会通知您当前缺少哪些特征和要求。这会告诉您需要通过推断 API 或其他提供程序来推断哪些数据。
AR 是不可预测的。应提供应用程序的任何关键功能的意外情况和回退。
通常最好将房间扫描和调试可视化保留为启用状态,至少直至放置了内容为止。这样可以为终端用户确保应用程序的正常运行。
人工合成数据为您提供一种分层构建 AR 体验的方法。例如,通常在您的环境中创作人工合成“生成点”胜过直接在环境中放置关键内容。因此,可以编写条件来寻找最接近用户的生成点。有关更多信息,请参阅基于人工合成数据来放置内容。