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

如何让Vuforia在AAB拆分二进制包环境下正常工作?

解决AAB拆分二进制模式下Vuforia数据库无法加载的问题

在Unity 2022.3.25f1 + Vuforia 10.22.5环境下,构建启用Split Application Binary的Android App Bundle(AAB)时,Vuforia数据库无法被识别,但构建为APK时功能正常。项目包含加载场景和主场景(主场景约1.5GB),尝试过AssetBundle打包Vuforia数据库(.dat文件无法被包含)、延迟等待StreamingAssets相关Asset Pack下载,但问题仍存在,且应用体积小于150MB时Vuforia可正常工作。

以下是针对性的修复方案:

方案1:精准等待StreamingAssets资源包就绪

你的现有代码依赖全局属性判断Core Asset Packs状态,可能出现误判——部分Pack就绪但Vuforia数据库所在的UnityStreamingAssetsPack未完成下载。需直接检查该资源包的状态:

IEnumerator Start()
{
#if UNITY_EDITOR
    yield return null;
#else
    // 直接指定StreamingAssets对应的资源包名称
    string streamingAssetsPack = "UnityStreamingAssetsPack";
    yield return StartCoroutine(WaitForTargetAssetPack(streamingAssetsPack));
    
    // 加载主场景
    AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(1);
    asyncOperation.allowSceneActivation = false;

    while (!asyncOperation.isDone)
    {
        loadingPercent.text = $"{(int)(asyncOperation.progress * 100)}%";
        if (asyncOperation.progress >= 0.9f)
        {
            asyncOperation.allowSceneActivation = true;
        }
        yield return null;
    }
#endif
}

IEnumerator WaitForTargetAssetPack(string packName)
{
    bool isReady = false;
    while (!isReady)
    {
        var operation = AndroidAssetPacks.GetAssetPackStateAsync(new[] { packName });
        yield return operation;

        if (operation.isDone)
        {
            var state = operation.GetAssetPackState(packName);
            if (state == AssetPackState.Available || state == AssetPackState.Downloaded)
            {
                isReady = true;
                errorTtext.SetText("StreamingAssets资源包已就绪");
            }
            else if (state == AssetPackState.Failed)
            {
                errorTtext.SetText("资源包下载失败,请检查网络");
                yield return new WaitForSeconds(5);
            }
            else
            {
                yield return new WaitForSeconds(2);
            }
        }
    }
}

方案2:手动复制Vuforia数据库到可访问路径

AAB模式下StreamingAssets为压缩状态,Vuforia默认API无法直接读取。可将数据库文件复制到PersistentDataPath后再加载:

IEnumerator PrepareVuforiaDatabases()
{
    // 替换为你的数据库文件名
    string[] dbFiles = { "YourDatabase.dat", "YourDatabase.xml" };
    bool allCopied = true;

    foreach (var fileName in dbFiles)
    {
        string srcPath = Path.Combine(Application.streamingAssetsPath, fileName);
        string destPath = Path.Combine(Application.persistentDataPath, fileName);

        if (!File.Exists(destPath))
        {
            using (UnityWebRequest www = UnityWebRequest.Get(srcPath))
            {
                yield return www.SendWebRequest();
                if (www.result != UnityWebRequest.Result.Success)
                {
                    Debug.LogError($"复制数据库失败:{www.error}");
                    allCopied = false;
                    break;
                }
                File.WriteAllBytes(destPath, www.downloadHandler.data);
            }
        }
    }

    if (allCopied)
    {
        // 从PersistentDataPath加载数据库
        var objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
        var dataSet = objectTracker.CreateDataSet();
        if (dataSet.Load(Path.Combine(Application.persistentDataPath, "YourDatabase.xml")))
        {
            objectTracker.ActivateDataSet(dataSet);
            Debug.Log("Vuforia数据库加载成功");
        }
        else
        {
            Debug.LogError("Vuforia数据库加载失败");
        }
    }
}

在Start协程中先执行该方法,再加载主场景。

方案3:调整AAB资源包拆分规则

  • 打开Player Settings > Android > Publishing Settings > Asset Packs
  • 确保Vuforia数据库所在的StreamingAssets目录被归入UnityStreamingAssetsPack,未被手动分配到其他自定义资源包
  • 禁用自动拆分大文件的选项,避免数据库文件被单独拆分

关键注意事项

  • 应用体积超过150MB时,Google Play会强制启用按需下载,StreamingAssets不会随主APK下发,必须等待对应资源包下载完成
  • Vuforia初始化和数据库加载必须在资源包就绪后执行,不能提前触发
  • 测试需使用Google Play内部测试渠道,直接用bundletool生成的APK无法模拟完整的资源包下载流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:21:24