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

如何通过脚本动态切换Vuforia模型目标检测

Vuforia脚本切换模型目标及CreateModelTarget失败排查

可以通过脚本控制切换检测的模型目标,核心思路是管理ModelTargetBehaviour实例的启用/禁用,或动态创建新的ModelTarget替换当前检测目标。针对你使用CreateModelTarget失败的问题,以下是常见排查点及解决方案:

1. 确认数据库与资源配置

  • 确保Model B所在的数据库已导入项目,对应的.xml和.dat文件存放在StreamingAssets/Vuforia目录下。
  • 检查VuforiaConfiguration.Instance.DatabaseLoadBehaviour设置,确保目标数据库处于可访问状态(预加载或按需加载)。

2. 正确调用CreateModelTarget的流程

以下是标准的目标创建与切换示例代码:

using UnityEngine;
using Vuforia;

public class ModelTargetSwitcher : MonoBehaviour
{
    public string targetDatabaseName = "YourDatabaseName";
    public string modelTargetName = "ModelB";

    public void SwitchToModelB()
    {
        // 禁用当前所有活跃的ModelTarget
        foreach (var mtb in FindObjectsOfType<ModelTargetBehaviour>())
        {
            mtb.enabled = false;
        }

        // 获取目标数据库
        var database = VuforiaBehaviour.Instance.DatabaseManager.GetDatabase(targetDatabaseName);
        if (database == null)
        {
            Debug.LogError($"数据库 {targetDatabaseName} 未找到");
            return;
        }

        // 创建ModelTarget
        var newModelTarget = VuforiaBehaviour.Instance.ObserverFactory.CreateModelTarget(database, modelTargetName);
        if (newModelTarget == null)
        {
            Debug.LogError($"无法从数据库创建ModelTarget {modelTargetName}");
            return;
        }

        // 配置并启用新目标
        newModelTarget.transform.SetParent(transform);
        newModelTarget.enabled = true;
        newModelTarget.SetActive(true);
    }
}

3. 初始化时机问题

必须在Vuforia初始化完成后再调用目标创建方法,可通过监听初始化事件确保时机正确:

private void Start()
{
    VuforiaARController.Instance.OnVuforiaInitialized += OnVuforiaReady;
}

private void OnVuforiaReady(VuforiaInitError error)
{
    if (error == VuforiaInitError.NONE)
    {
        SwitchToModelB();
    }
}

4. 目标类型匹配问题

如果Model B是Advanced Model Target,需使用CreateAdvancedModelTarget方法,而非普通的CreateModelTarget,否则会创建失败。

5. 动态加载数据库处理

若数据库为动态加载(未勾选预加载),需先异步加载数据库再创建目标:

public async void LoadDatabaseAndSwitch()
{
    var loadResult = await VuforiaBehaviour.Instance.DatabaseManager.LoadDatabaseAsync(targetDatabaseName);
    if (loadResult.Status == DatabaseLoadStatus.Success)
    {
        SwitchToModelB();
    }
    else
    {
        Debug.LogError($"数据库加载失败:{loadResult.ErrorMessage}");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:44:54