一.引言

在 XR(扩展现实)技术日渐普及的今天,Unity 已成为开发 VR、AR 和 MR 应用的主流平台。然而在这个生态蓬勃发展的背后,XR 的接口标准也经历了混乱到统一的演进过程。从早期的厂商割据,到 Unity 的初步抽象,再到 OpenXR 的出现,一步步走向“写一次,到处运行”的理想。

二.什么是 XR?它和 VR、AR、MR 的关系?

XR 是“Extended Reality”(扩展现实)的缩写,是一个统称,涵盖了以下三类技术:

  • VR(Virtual Reality,虚拟现实):用户完全沉浸在一个虚构的 3D 虚拟世界中,比如使用 Oculus Rift、HTC Vive 体验的游戏或模拟场景。

  • AR(Augmented Reality,增强现实):将虚拟物体叠加到现实世界中,常用于手机、眼镜等设备,如 Google ARCore、Apple ARKit。

  • MR(Mixed Reality,混合现实):虚拟内容与现实世界实时交互并融合,强调更深层次的物理/空间理解,比如 Microsoft HoloLens。

XR 是对 VR、AR 和 MR 的总称,用来泛指所有这类“现实+虚拟”结合的技术。Unity 将这些技术整合进统一框架,统称为 XR 系统。


三.发展进程 

1. 各自为战的早期混乱

最初,XR 设备制造商如 Oculus(Meta)、HTC Vive、HoloLens、ARCore(Google)、ARKit(Apple)等各自推出了各自的 SDK。这些 SDK 各不兼容:

  • Meta 使用 Oculus SDK

  • HTC 使用 SteamVR / Vive SDK

  • Android 平台使用 ARCore

  • iOS 则使用 ARKit

这意味着开发者必须针对每个平台分别适配、编写交互逻辑,代码重复、维护困难、移植复杂。


2. Unity XR Plug-in Framework:初步统一

为了缓解上述问题,Unity 推出了 XR Plug-in Management 框架,试图规范 XR 插件的接入流程。Unity 将原本各家 SDK 封装为统一的 XR Plug-in 接口,比如:

  • Oculus XR Plugin

  • ARCore XR Plugin

  • Windows XR Plugin

  • Mock HMD Loader(虚拟测试设备)

配合 XR Interaction Toolkit 和 Input System,Unity 提供了一套可复用的开发范式,一定程度的屏蔽了各个厂商SDK的差异。但开发者仍需手动为不同平台切换插件,部分 API 也仍存在厂商差异。

 

笔者近期对接一个厂商的设备,导入了它家的SDK,因为厂商接入了  XR Plug-in Management 框架

所以我可以很方便的配置,只需要简单的勾选.但你可能感到疑问,为什么就这么几个选项,前面不是提到一大堆厂商吗?他们的SDK选项去哪了?请往下看!


3. OpenXR:由 Khronos Group 推出的统一标准

OpenXR 是由 Khronos Group(OpenGL/Vulkan 的制定者)主导的跨平台 XR 规范。目标是让所有 XR 平台和设备使用统一的接口标准。

其带来的好处是显而易见的:

  • 开发者使用一套 API(如 Unity 的 OpenXR 插件)

  • 所有支持 OpenXR 的设备可直接运行

  • 极大简化开发成本与平台迁移代价

如今主流厂商如 Meta、Pico、HTC、微软等均已提供 OpenXR Runtime 实现,并逐渐弃用自家旧 SDK。

你可能感到疑问:在OpenXR出现之前,Unity难道没有帮我们屏蔽各个厂商SDK的差异吗?

答案是:

在 OpenXR 出现之前,Unity 的 XR Plug-in Management 确实已经在做“屏蔽厂商 SDK 差异”的工作,但有以下几个重要特征:

Unity XR Plug-in Management 是一个 插件管理框架

它做的事情是:

  • 让你能通过 UI 面板方便切换 SDK(比如 Oculus XR Plugin、ARCore Plugin、Windows XR Plugin)

  • 提供统一的生命周期管理(初始化、启用、禁用 XR)

 但是,它并没有提供统一的运行时行为(比如不同 SDK 的输入系统、空间定位、手柄交互方式等行为仍不同)。

所以 Unity 后来推出了 XR Interaction Toolkit —— 真正统一开发接口

  • XR Plug-in Management 管插件生命周期(选谁、启谁)

  • XR Interaction Toolkit 管开发接口(开发者怎么写)

但这里的问题来了:

各家 SDK 的实现行为和支持范围仍有差异,即使你都使用 Toolkit,有些功能不同厂商支持也不同。

例如:

功能Oculus XR PluginARCore PluginWindows XR Plugin
手柄交互支持
头部追踪
手势识别
Haptic(触感)反馈

 总结:

Unity XR Plug-in Management + XR Interaction Toolkit = 半统一 

插件管理是统一的,但底层行为因 SDK 差异仍不一致

需要开发者写一些分平台逻辑,兼容差异(例如 if UNITY_ANDROID && !UNITY_EDITOR

OpenXR的强大:

特点之前(XR Plug-in + Toolkit)OpenXR 之后
插件切换手动切换插件统一一个插件
行为统一(如交互/输入)存在差异底层行为统一
可扩展性(比如手势系统)SDK 限制通过 OpenXR extension
厂商适配多套插件一套 OpenXR runtime

前面提到的我对接的哪家厂商就没实现OpenXR,所以我就不可避免的使用他家特有的API,导致我的代码实现不了一次编写到处运行.

这也回答了刚才的问题:多家厂商的SDK都被统一到OpenXR的选项上了

这需要我们引入OpenXR的包,因为我没引入这个包,所以刚才的截图没有该选项,但是为什么PC下面就有这个选项呢?这其实是一个快捷的预安装选项,勾选之后会自动帮我引入OpenXR的包,引入了包安卓下面也会出现OpenXR选项. 

但要注意的是:

虽然 OpenXR 实现了跨厂商 XR 接口的统一,但这并不意味着从此完全脱离厂商 SDK。在许多情况下,厂商会通过 OpenXR 提供基础功能支持,而将高级特性、运行时驱动、扩展能力保留在自己的 SDK 中。因此,即使使用 Unity 的 OpenXR Plugin,我们在开发中仍有可能需要引入厂商的支持插件,例如 HTC 设备需依赖 SteamVR 插件完成设备连接与功能调用。

IOS似乎拒绝加入OpenXR,还需要引入额外的包.


4. Unity + OpenXR:开发者视角

Unity 对 OpenXR 的支持主要通过以下几个官方包实现:

  • OpenXR Plugin:用于注册和管理底层 OpenXR runtime

  • XR Plug-in Management:用于选择 XR 后端(OpenXR、Oculus 等)

  • XR Interaction Toolkit:提供统一的交互行为(抓取、指向、按钮等)

如果所用设备支持 OpenXR,开发者只需勾选 OpenXR,使用 XR Interaction Toolkit 就可实现大部分 XR 功能,无需关注厂商差异。


5. 未完全统一的现实:平台与厂商的落差

尽管 OpenXR 是趋势,但现实中并非所有平台与厂商都已完成迁移:

  • Android 平台 仍常见 ARCore 与 Oculus 插件选项

  • iOS 平台 完全不支持 OpenXR,只能继续使用 ARKit

  • 部分中小厂商(如 RhinoX Pro) 提供自研 SDK,虽声称遵循 Unity XR Plug-in 接口,但未实现 OpenXR Runtime,仍需调用其自定义 API

这导致在某些项目中仍不可避免地混用官方与厂商 API。

就比如这家厂商还没完全迁移到OpenXR,所以就遗留了这个选项.


6. OpenXR 并非银弹:平台差异仍存在

尽管 OpenXR 统一了设备差异,但平台差异(如 Android vs Windows)仍需开发者关注:

  • UI 呈现、资源管理、文件路径等仍不一致

  • AR 支持(如环境理解)目前未被 OpenXR 完全覆盖

  • 性能调优策略、渲染管线等也需平台自适应

也就是说,OpenXR 是“统一设备行为”的手段,但不是“统一 一切平台差异”的解决方案。


7. 实践建议

  • 使用支持 OpenXR 的设备时,优先使用 Unity 官方的 OpenXR 插件和 XR Interaction Toolkit

  • 如果设备未支持 OpenXR,需根据厂商文档使用其 SDK,放弃 XR Toolkit 的部分功能

  • 针对多平台部署,需做好平台判断与抽象封装

  • 持续关注厂商 SDK 和 Unity 的更新节奏,掌握第一手迁移时机

仅个人理解,欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909680.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909680.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909680.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础教学:航天工程领域的精确计算和金融领域的精确计算,分别采用的小数保留位数的方法有哪些?有什么区别?-由Deepseek产生

在Python中处理航天工程和金融领域的精确计算时,虽然都强调精度,但因目标需求、误差容忍度和计算性质不同,其小数保留位数的方法和策略存在显著差异。以下是关键方法和区别分析: 一、航天工程领域 核心需求: 物理世界…

机器人玩具:成年人的心灵游乐场与未来前哨

当提及“机器人玩具 ”,许多人脑海中仍会浮现出孩童在游戏垫上摆弄塑料小人的画面。然而,时代已悄然转变——那些曾被视为童年专属的机械伙伴,如今正被越来越多的成年人郑重捧在手中。这不是一种幼稚的退行,而是一场关于创造力、情…

Spring Cloud LoadBalancer深度解析:官方负载均衡方案迁移指南与避坑实践

引言:为什么LoadBalancer正在取代Ribbon? “Ribbon已进入维护模式” —— Spring官方公告 当你的Spring Boot升级到3.x版本,Ribbon的依赖项将无法通过编译。作为Spring Cloud 官方钦定的替代方案,LoadBalancer凭借: ✅…

暴雨服务器成功中标洪湖市政府框架采购项目

近日,在洪湖市政府 2025 年度行政事业单位服务器封闭式框架协议采购项目中,暴雨服务器凭借其卓越的性能、优质的服务以及合理的价格,成功脱颖而出,赢得了该项目的中标资格。这一成果不仅标志着暴雨服务器在政府领域的认可度进一步…

C# 多线程按顺序执行之ManualResetEvent

ManualResetEvent被用于在** 两个或多个线程间** 进行线程信号发送。 多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态。当控制线程调用Set()方法,所有等待线程将恢复并继续执行。 以下是使用ManualResetEvent的例子,确保多线…

SQL里的正则

1393-capital-gainloss https://leetcode.com/problems/capital-gainloss/description/ IDEA报红但是能执行! -- 用全部卖出的减去全部买入的 with b as ( select stock_name, sum(price) AS total_buy_price from Stocks where operation Buygroup by stock_na…

计算机求职提前批/求职什么时候投递合适

前言 大家秋招或者春招,可能一直在网上冲浪,看到一些人在鼓吹说提前批开始,秋招开始。必须要赶紧找工作了,再不找就失业了等等。 然后,到自己就开始焦虑,感觉别人都在投简历,自己不投感觉很吃亏…

八种数据结构简介

目录 1.1 数据结构概述 1.2 数据结构的分类 1.2.1 逻辑结构 1)集合 2)线性结构 3)树形结构 4)图形结构 1.2.2 物理结构 1)顺序存储 2)链式存储 3)散列存储 4)索引存储 …

破壁虚实的情感科技革命:元晟定义AI陪伴机器人个性化新纪元

在人工智能席卷全球的浪潮中,广东中山一家名为元晟传媒科技的企业正悄然改写情感陪伴产业的游戏规则。作为广东元伴智能科技(下称“元伴智能”)的战略级下属机构,中山元晟传媒科技凭借独特的“技术场景流量”三角模型,…

leetcode_455 分饼干

1. 题意 给一堆饼干,和一群小朋友。饼干有大小,小朋友有胃口值;小朋友不吃比自己胃口小的饼干,问这些饼干能满足多少小朋友食用。 2. 题解 排序贪心 优先用小饼干满足胃口小的小朋友,这样大饼干就能留给胃口大的小朋…

使用 C# 源生成器(Source Generators)进行高效开发:增强 Blazor 及其他功能

.NET 中源生成器的引入彻底改变了我们的开发方式,它消除了动态逻辑,并在编译时生成静态代码。这不仅提高了应用程序的性能,还提升了开发人员的生产力和代码质量。 如果您正在使用Blazor(WebAssembly 或服务器)或构建需…

word如何插入高清晰的matlab绘图

emf矢量图 在matlab中画好的图另存为emf格式,保存到本地,然后在word中选择插图图片,注意不要复制粘贴。 亲测好用!

解锁 ChatGPT 超能力:全新「记忆」功能深度解析!

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

低压电涌保护:构筑电气设备的安全防线

在现代电力系统中,低压电涌保护扮演着至关重要的角色。雷电和电力系统中的瞬态过电压,是威胁电气设备安全运行的潜在风险。低压电涌保护器(SPD)作为一种专门设计的防护装置,能够有效地抑制这些电涌,确保电气…

GitLab多人协作MR流程规范模版(merge)

以下是一个适用于 GitLab 多人协作的 MR 流程规范模板,涵盖分支策略、MR 创建流程、冲突处理、审查要求和 CI/CD 设置。可以直接复制到团队 Wiki 或文档中使用。 📘 一、分支策略 main ← 线上生产分支,仅从 release 合并 dev …

分布式系统全链路监控之一:分布式全链路监控基础概念和OpenTelemetry

文章目录 前言什么是OpenTelemetry核心概念可观测性可靠性和指标理解分布式链路追踪日志跨度链路 上下文传播上下文传播 信号日志OTel日志在 OTel Collector 中的 OTel日志应用程序的OTel日志 结构化、非结构化和半结构化日志结构化日志非结构化日志半结构化日志 OTel日志组件 …

C# 正方形外接圆的面积(Area of a Circumscribed Circle of a Square)

给定正方形的边长,求其外接圆的面积。 示例: 输入:a 6 输出:外接圆的面积为:56.55 输入:a 4 输出:外接圆的面积为:25.13 正方形的四条边相等,四个角均为90度。圆…

ROS学习话题通信之Python实现

与上一篇C实现同理 下面给出相关的Python实现代码 关于py文件的 talker:(demo01_talker_str_py import rclpy from rclpy.node import Node from std_msgs.msg import Stringclass Talker(Node):def __init__(self):super().__init__("talker_node_py")…

Spring MVC 入门案例:从代码到原理的深度剖析

一、引言 Spring MVC 是一种基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,它为开发 Web 应用提供了强大而灵活的解决方案。本文将通过一个简单的 Spring MVC 入门案例,详细介绍其工作流程,帮助读者深入理解 Spring MVC …

零基础学前端-传统前端开发(第四期-JS基础-数组)

注:JS文章流程为:数据类型>>运算>>语法,语句>>对象>>数组>>函数>>类 什么是数组:数组是一种非常常用的数据结构,用于存储一组有序的值。这些值可以是数字、字符串、对象&#xff…