You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:53:15