本节摘要:XR 项目接入硬件的方式有三条:OpenXR(跨平台标准 API)、ARKit(Apple iOS/macOS)、ARCore(Google Android)。本节拆开三条 API 的能力边界、用 XR 项目怎么选;再用 Unity 的 XR Plugin Management 做"一份代码,多端部署"的演示。
阅读完本节,你应当能够:
XR 项目接硬件的 API 选型之所以复杂,是因为它分三层:
直觉上:OpenXR 是"行业标准"那一层,往上是平台 SDK,往下是设备 SDK。一个 XR 项目要么直接接 OpenXR(跨平台),要么接平台 SDK(拿到平台独占能力)。
OpenXR 由 Khronos Group 2017 年发起,2019 年发布 1.0,目前是 1.1 版本。它的架构分三层:
App 不直接调厂商 SDK——它调 OpenXR,OpenXR 加载到对应 Runtime,由 Runtime 完成硬件适配。这就是为什么同一份 OpenXR 代码能跑在 Quest 3、Vive Pro 2、Pico 4 上。
ARKit 是 Apple 2017 年发布的 iOS AR 框架,2024 年发布 ARKit 6。当前能力:
ARKit 是 iOS 唯一支持的 AR 框架。Vision Pro 在 visionOS 1.0 阶段用 ARKit 的子集(去掉部分 API)作为底层;visionOS 2.0 后增加"PolySpatial"模式,把 Unity/Unreal 的标准 3D 渲染管线桥接到 ARKit 的空间渲染上。
ARCore 是 Google 2018 年发布的 Android AR 框架。当前能力:
ARCore 在 Android 8.0+ 设备上可用,覆盖 1.32+ 设备。Google 在 2024 年发布的 ARCore 1.42 增加了"地理空间 API(Geospatial API)"——把 AR 内容钉到真实地理坐标上。
visionOS 1.0 不支持 OpenXR。Apple 走了另一条路:让 Unity/Unreal 渲染出标准 3D 画面,然后通过"PolySpatial"桥接到 visionOS 的空间渲染。
PolySpatial 模式的关键能力:
visionOS 2.0 起部分支持 OpenXR 子集(XR_EXT_eye_gaze_interaction、XR_EXT_hand_interaction),但 PolySpatial 仍是 Apple 推荐的主路径。
| 能力 | OpenXR 1.1 | ARKit 6 | ARCore 1.42 |
|---|---|---|---|
| 6DoF 头手 | ✓ | ✓ | ✓ |
| 平面检测 | 间接(厂商扩展) | ✓ | ✓ |
| 场景网格 | 间接 | ✓ (SceneReconstruction) | ✓ (Depth API) |
| 房间捕捉 | 间接 | ✓ (RoomPlan) | ✗ |
| 云锚点 | 间接 | ✗ | ✓ (Cloud Anchors) |
| 眼动 | ✓ | ✓ | 弱 |
| 手势 | ✓ | ✓ | 弱 |
| 注视点渲染 | ✓ | ✓ | ✗ |
| 跨设备 | 极强 | iOS/macOS 限定 | Android 限定 |
| 跨平台 Runtime | ✓ | ✗ | ✗ |
💡 关键直觉:选 SDK 的判断很简单——"项目只跑 iOS/macOS"→ ARKit,"只跑 Android"→ ARCore,"跨平台"→ OpenXR。"Vision Pro 专属"→ PolySpatial。
// 1. 安装 XR Plugin Management(Unity Package Manager) // 2. 在 Project Settings → XR Plugin Management 勾选: // - OpenXR(PC、Quest、Pico) // - ARKit(iOS) // - ARCore(Android) // 3. 用条件编译区分平台 #if UNITY_IOS using UnityEngine.XR.ARKit; #elif UNITY_ANDROID using UnityEngine.XR.ARCore; #else using UnityEngine.XR.OpenXR; #endif public class CrossPlatformAR : MonoBehaviour { void Start() { #if UNITY_IOS var session = ARKitSessionSubsystem.s_SubsystemInstance; session.Start(); #elif UNITY_ANDROID ArCoreApk.CheckAvailability(); // 简化示例 #else XRGeneralSettings.Instance.Manager.InitializeLoaderSync(); #endif } }
打包成 iOS→AR 走 ARKit;Android→AR 走 ARCore;Windows→VR 走 OpenXR。同一份代码。
下一节我们看一条 XR 项目的完整流水线。