开发

共享场景示例

更新时间: 2024年11月4日
Unity-SharedSpatialAnchors 场景共享旨在演示如何使用共享空间锚点 API。该 API 在 Unity 游戏引擎的 Meta XR 核心 SDK 中提供。该示例应用展示了如何创建、保存、加载以及共享空间锚点,还展示了如何共享场景对象(墙壁、地板、书桌、餐桌等)。
在锚点和场景共享方面,该应用采用 Photon Unity Networking 共享玩家数据,允许用户与同地空间内的网络对象互动。
这种代码库既可以作为一个参考,也可以给使用共享空间锚点的游戏当作模板。除非另行指定,否则项目通常位于 Unity-SharedSpatialAnchors 许可证下。
请参阅贡献文件,了解如何进行贡献。

设置项目环境

您可以前往 Oculus 示例 GitHub 找到 Unity-SharedSpatialAnchors。通过 Unity Hub 下载 2022.3.15f1+ 版本(推荐 Unity 6+)并启用 Android 编译版本支持(OpenJDK、Android SDK 和 NDK 工具)。

在开发者面板中注册应用并更新平台设置

若要共享空间锚点,您的应用需要使用 Quest 平台功能。
这要求您在开发者面板上进行应用注册。
  1. 在您的开发者组织下点击创建新应用
  2. 输入应用名称。
  3. 选择 Meta Horizon 商店。如果您也会在电脑上使用 Link 运行应用,则重复上述步骤,创建一个 Rift 应用。
  4. 从左侧导航栏中选择要求 > 数据使用情况检查
  5. 完成年龄段自证,然后请求访问用户编号用户档案平台功能。
  6. 从左侧导航栏中选择开发 > API。确定选好应用之后,记下应用编号下面的数字。
在 Unity 中打开项目后,在 V63 SDK 中前往 MetaOculus > 平台 > 编辑设置
  1. 将此前步骤中找到的 Quest 应用编号输入到 Meta Quest/2/Pro 字段中。
  2. 如果您想用 Link 进行测试,请在 Oculus Rift 字段中注明 Rift 应用编号
  3. 构建设置下,将捆绑包标识符更换为有效且唯一的 Android软包名称,如 com.yourcompany.ssa_sample。您应用的锚点将与该包名称相关联。

Photon

本项目使用 Photon 的 PUN 来支持多玩家游戏网络。创建新 Photon 应用程序的步骤如下:
  1. Photon 上创建一个账户。
  2. 面板页面上根据提示创建一个新应用。
    • 选择 Photon SDK:设置为 PUN。
    • 名称和描述:可随意设置。
    • 网址:可留空。
  3. 在您的开发者账户上创建一个 PUN 应用,然后将应用编号添加到 Assets/Photon/PhotonUnityNetworking/Resources/PhotonServerSettings 文件中的 App Id Pun 条目。您可以通过菜单窗口 > Photon Unity Networking > 突显服务器设置找到 PhotonServerSettings

预配置的项目设置

OVRManager 配置
OVRManager 组件能与每个场景中的 OVRCameraRig 对象相连。
OVRManager 的以下参数必须进行 SSA 配置:
  • 追踪来源类型:STAGE
    • STAGE 追踪来源类型将确保发生重新回位事件时,虚拟对象不会移动。
  • 锚点支持:启用
  • 共享空间锚点支持:必备或支持
    • 示例应用选择的是支持,因为其中包含本地锚点功能。

Android 清单

Android 清单工具可用于更新您的项目清单,以支持 SSA。
V63 SDK 中的 MetaOculus > 工具 > 创建与商店兼容的 AndroidManifest.xml
使您的应用支持 SSA 和透视需要获得以下权限:
  • <uses-permission android:name=”com.oculus.permission.USE_ANCHOR_API” />
  • <uses-permission android:name=”com.oculus.permission.IMPORT_EXPORT_IOT_MAP_DATA” />
  • <uses-feature android:name=”com.oculus.feature.PASSTHROUGH” android:required=”true” />
与上述 OVRManager 配置联用时,Oculus 清单工具将添加这些权限。

功能

加入场景时,您会处于一个以左右控制器作为虚拟表示的透视环境中。

控制面板

控制面板会跟随左控制器。您可以用右控制器与它互动,然后按下控制器上带有白点的菜单按钮。使用控制面板创建或加入一个房间即可开始。
控制面板的主菜单包含以下功能:
  • 切换锚点创作器:切换锚点创作模式。启用后,可以在您的右手边看到锚点预览。按下触发器可将新的空间锚点放入场景中。
  • 加载本地锚点:下载并实例化头戴设备上保存的锚点。
  • 生成互联立方体:在菜单正上方生成一个立方体。房间里所有玩家都能看见和抓取这个立方体。抓取立方体的操作会将网络所有权转移给拿到立方体的玩家。
  • Photon 信息面板:显示玩家已连接到的 Photon 房间、当前连接状态以及房间内的用户列表。
  • 日志记录面板:菜单的右半部分用于日志记录(调试目的)。您可以按右下方的箭头按钮,查看多个日志页面。

锚点面板

生成锚点时,锚点面板会随之出现。
锚点面板包含以下功能:
  • 本地保存锚点:将锚点保存到本地头戴设备上。若要加载锚点,从控制面板选择加载本地锚点选项即可。
  • 隐藏锚点:从场景中删除锚点,但如果之前已保存,锚点仍会保存在您的本地头戴设备上。若要重新生成锚点,在控制面板上选择加载本地锚点选项即可。
  • 清除锚点:从场景中删除锚点并清除本地存储空间中已保存的文件。这样做的话,您将无法再加载锚点。
  • 共享锚点:与连入房间的所有其他用户和加入该房间的新用户共享锚点。
  • 对齐锚点:重新对齐头戴设备的坐标系统,使其根据该锚点进行变换。这样一来,当多个用户对齐同一个共享锚点时,就能实现同地。此时您会发现,互联立方体将出现在所有玩家的相同位置。

场景

注意:此场景是 Unity-SharedSpatialAnchors 示例项目的一部分。如要获取该场景,请从 GitHub 克隆或下载示例项目。场景位于示例项目的 Assets/SceneSharing/Scenes/SharedSpatialAnchorsWithScene.unity 内。

场景层级结构

  • ControlPanel - 用于创建/加载锚点和生成立方体的世界空间用户界面
  • PhotonNetworkManager - 网络管理工具,用于进行 Photon 房间管理、玩家同步以及共享锚点编号的分享。
  • AlignPlayer - 将锚点位置从世界空间变换为本地空间,并将方向应用到 OVRCameraRig
  • OVRCameraRig - 追踪空间以 OVR 相机和手部组件作为子部件
  • SceneCaptureController - 管理场景 API 的通话和回电
  • WorldGenerationController - 控制场景对象的对象和网格创建

Prefab

  • SpatialAnchorPlacement:锚点放置可视化的放置 Prefab
  • SpatialAnchorPrefab:
    • SharedAnchor:锚点对齐和共享的界面
    • OVRSpatialAnchor:SDK 脚本,可控制定位后的锚点方向。
  • PhotonGrabbableObject:管理互联立方体的所有权转移
  • PhotonThowableObject:管理互联立方体的所有权转移

脚本/组件

  • SharedAnchorLoader:管理 SSA API 的 API 通话和回电
  • SceneApiSceneCaptureStrategy:管理场景 API 的通话和回电
  • 场景:用于存储和共享场景数据的序列化对象(墙壁、书桌、地板等)