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

Unity+HoloLens开发:运行时动态切换Vuforia高级模型目标

解决HoloLens上Vuforia Advanced Model Target动态切换问题

你的脚本核心问题在于未初始化关键数组、缺失Model Target配置逻辑,以及卸载流程不完整。以下是修正后的实现方案:

问题分析

  1. dataSetPaths和targetNames未赋值:这两个数组为空,导致加载时直接触发索引错误
  2. Advanced Model Target创建后未配置:仅创建ObserverBehaviour不足以启用跟踪,需设置Advanced Model Target的特定参数
  3. DataSet卸载逻辑缺失:仅销毁Observer无法完全释放DataSet资源
  4. HoloLens路径适配问题:DataSet需放在StreamingAssets/Vuforia目录下,路径需对应平台规则

修正后的脚本

using UnityEngine;
using UnityEngine.UI;
using Vuforia;

public class AdvancedModelTargetSwitcher : MonoBehaviour
{
    [Header("DataSet配置")]
    public string[] dataSetPaths; // 格式:"Vuforia/你的数据集名称"(对应StreamingAssets下的路径)
    public string[] targetNames; // 数据集中的Model Target名称
    public AdvancedModelTargetConfiguration.TrackingMode trackingMode = AdvancedModelTargetConfiguration.TrackingMode.GUIDED;

    private int currentIndex = 0;
    private ObserverBehaviour currentModelTarget;
    private DataSet activeDataSet;

    void Start()
    {
        VuforiaApplication.Instance.OnVuforiaInitialized += OnVuforiaInitialized;
    }

    void OnVuforiaInitialized(VuforiaInitError error)
    {
        if (error == VuforiaInitError.NONE)
            LoadCurrentModelTarget();
        else
            Debug.LogError($"Vuforia初始化错误: {error}");
    }

    void LoadCurrentModelTarget()
    {
        // 校验数组有效性
        if (dataSetPaths == null || targetNames == null || dataSetPaths.Length != targetNames.Length)
        {
            Debug.LogError("DataSet路径和目标名称数组长度不匹配或未赋值");
            return;
        }
        if (currentIndex < 0 || currentIndex >= dataSetPaths.Length)
        {
            Debug.LogError($"无效索引: {currentIndex}");
            return;
        }

        // 卸载旧资源
        UnloadCurrentResources();

        // 加载DataSet
        activeDataSet = VuforiaBehaviour.Instance.DatabaseManager.LoadDataSet(dataSetPaths[currentIndex]);
        if (activeDataSet == null)
        {
            Debug.LogError($"加载DataSet失败: {dataSetPaths[currentIndex]}");
            return;
        }

        // 创建Model Target观察者
        currentModelTarget = VuforiaBehaviour.Instance.ObserverFactory.CreateModelTarget(activeDataSet, targetNames[currentIndex]);
        if (currentModelTarget == null)
        {
            Debug.LogError($"创建Model Target失败: {targetNames[currentIndex]}");
            return;
        }

        // 配置Advanced Model Target参数
        var advancedModelTarget = currentModelTarget.GetComponent<AdvancedModelTargetBehaviour>();
        if (advancedModelTarget != null)
        {
            advancedModelTarget.Configuration.TrackingMode = trackingMode;
            advancedModelTarget.Configuration.EnableAutoScan = true; // 根据需求开启自动扫描
        }

        // 订阅状态变更事件
        currentModelTarget.OnTargetStatusChanged += OnTargetStatusChanged;
        // 启用观察者
        currentModelTarget.enabled = true;
    }

    void OnTargetStatusChanged(ObserverBehaviour behaviour, TargetStatus status)
    {
        Debug.Log($"目标状态: {status.Status}");
        if (status.Status == Status.TRACKED)
        {
            // 这里添加跟踪到后的逻辑
        }
    }

    public void OnSwitchTargetButtonClick()
    {
        currentIndex = (currentIndex + 1) % dataSetPaths.Length;
        LoadCurrentModelTarget();
    }

    void UnloadCurrentResources()
    {
        // 移除事件订阅
        if (currentModelTarget != null)
        {
            currentModelTarget.OnTargetStatusChanged -= OnTargetStatusChanged;
            Destroy(currentModelTarget.gameObject);
            currentModelTarget = null;
        }

        // 卸载DataSet
        if (activeDataSet != null)
        {
            VuforiaBehaviour.Instance.DatabaseManager.UnloadDataSet(activeDataSet);
            activeDataSet = null;
        }
    }

    void OnDestroy()
    {
        UnloadCurrentResources();
        if (VuforiaApplication.Instance != null)
            VuforiaApplication.Instance.OnVuforiaInitialized -= OnVuforiaInitialized;
    }
}

配置步骤

  1. 放置DataSet文件:将Vuforia导出的.xml和.dat文件放到Unity项目的Assets/StreamingAssets/Vuforia目录下
  2. Inspector赋值:在挂载脚本的GameObject Inspector面板中,填写dataSetPaths(比如Vuforia/CarModel)和targetNames(对应数据集中的目标名称),确保两个数组长度一致
  3. Vuforia配置:打开Vuforia Configuration面板,确认Advanced Model Target选项已启用
  4. HoloLens平台设置:在Player Settings中,确保Virtual Reality Supported勾选,并且添加Windows Mixed Reality到VR列表

内容的提问来源于stack exchange,提问作者Dheeraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:20:55