如何在Hololens2(MRTK3+Unity2022)中启用二维码追踪并解决移植报错
HoloLens 2 + MRTK3 + OpenXR 二维码追踪完整实现方案
一、项目环境初始化
- 新建Unity 2022 LTS项目(推荐2022.3.x版本),切换平台到Universal Windows Platform,目标设备选HoloLens,架构指定ARM64。
- 导入MRTK3:打开Package Manager,点击
+>Add package by name,输入com.microsoft.mixedreality.toolkit,安装最新稳定版。 - 配置OpenXR:进入Project Settings > XR Plug-in Management,勾选OpenXR,点击Configure。在OpenXR Settings里添加HoloLens Feature Group,确保
QR Code Tracking扩展已启用。
二、配置MRTK3二维码扫描服务
- 在场景中添加MRTK核心对象:右键场景层级 >
Mixed Reality>Toolkit,自动生成MixedRealityToolkit游戏对象。 - 打开MRTK配置文件(选中
MixedRealityToolkit对象,在Inspector里点击Configuration Profile的编辑按钮),找到Input System板块,添加并启用QR Code Scanner Service(如果已有,确认Active状态为Enabled)。 - 按需调整扫描参数:比如扫描间隔、是否过滤特定二维码内容,根据项目需求设置即可。
三、实现二维码检测+球体渲染逻辑
创建一个自定义脚本QRCodeTrackerHandler.cs,替换你之前从MRTK2复制的旧脚本:
using UnityEngine; using Microsoft.MixedReality.Toolkit.Input; using Microsoft.MixedReality.Toolkit.QR; using Microsoft.MixedReality.Toolkit; public class QRCodeTrackerHandler : MonoBehaviour, IMixedRealityQRCodeHandler { [Tooltip("要生成的球体预制体")] public GameObject spherePrefab; [Tooltip("球体相对于二维码的Y轴偏移高度")] public float sphereHeightOffset = 0.1f; private void OnEnable() { CoreServices.InputSystem?.RegisterHandler<IMixedRealityQRCodeHandler>(this); } private void OnDisable() { CoreServices.InputSystem?.UnregisterHandler<IMixedRealityQRCodeHandler>(this); } // 检测到新二维码时触发 public void OnQRCodeDetected(QRCodeEventData eventData) { // 避免重复生成球体 var existingSphere = GameObject.Find($"QR_Sphere_{eventData.QRCode.Data}"); if (existingSphere == null && spherePrefab != null) { var sphere = Instantiate(spherePrefab); sphere.name = $"QR_Sphere_{eventData.QRCode.Data}"; // 设置球体位置:二维码空间位置 + Y轴偏移 var qrPose = eventData.QRCode.SpatialGraphNodeId.GetPose(); sphere.transform.position = qrPose.position + new Vector3(0, sphereHeightOffset, 0); // 绑定到二维码空间节点,实现跟随 var qrCoordinateSystem = SpatialGraphCoordinateSystem.TryGetCoordinateSystem(eventData.QRCode.SpatialGraphNodeId); if (qrCoordinateSystem != null) { sphere.transform.SetParent(qrCoordinateSystem.gameObject.transform); } } } // 二维码丢失时清理球体(可选) public void OnQRCodeLost(QRCodeEventData eventData) { var sphere = GameObject.Find($"QR_Sphere_{eventData.QRCode.Data}"); if (sphere != null) { Destroy(sphere); } } }
- 新建空对象
QRCodeHandler,挂载上述脚本,在Inspector中拖入你提前做好的球体预制体(记得给球体加Mesh Renderer和可见材质)。
四、修复MRTK2到MRTK3的命名空间/API错误
你之前复制的MRTK2代码报错,核心是API和命名空间变更,对应修复点:
- 替换MRTK2的
QRCodeScanner为MRTK3的QRCodeScannerService,通过CoreServices.GetService<IQRCodeScannerService>()获取实例。 - 事件接口从
IMixedRealityQRCodeObserverHandler改为IMixedRealityQRCodeHandler,对应处理方法是OnQRCodeDetected和OnQRCodeLost。 - 原
QRCode.Pose属性在MRTK3中需通过QRCode.SpatialGraphNodeId.GetPose()获取,因为MRTK3全面基于空间图节点管理空间定位。 - 移除所有MRTK2专属的命名空间引用(比如
Microsoft.MixedReality.Toolkit.Utilities中的废弃类),替换为MRTK3的对应API。 - 废弃原MRTK2的QRCode预制体,MRTK3不需要额外预制体,用上述自定义脚本即可完成逻辑。
五、测试与部署
- Unity编辑器测试:在Project Settings > XR Plug-in Management > OpenXR > Mock HMD中启用Webcam输入,点击Play后对准电脑摄像头前的二维码,即可看到球体生成。
- 设备部署:在Build Settings中选择UWP平台,点击Build生成APPX包,通过HoloLens Device Portal部署到设备,运行后对准二维码验证效果。
内容的提问来源于stack exchange,提问作者Khushi Naik
相关产品推荐
相关产品推荐

