从服务器获取AssetBundle清单文件

时间:2019-03-07 14:47:26

标签: unity3d manifest assets assetbundle

我是Unity的新手,我开始为我的项目使用AssetBundle从服务器下载它们。我使用UnityWebRequestAssetBundle来下载资产,因为WWW已过时。一切正常,我可以从服务器下载资产并将其放入persistentDataPath中,并且可以毫无问题地将它们加载到场景中。但是后来我意识到,更新模型可能会有机会,因此我还需要在应用程序中对其进行更新。我知道资产捆绑中每个资产都有一个清单文件,因此当我下载资产时,我也会下载清单文件。我将所有内容作为Unity文档进行处理,但始终会出现此错误:

unable to read header from archive file: /manifest/location

清单下载方法如下:

IEnumerator GetManifest(string animal)
{
    using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle("http://weppage.com/" + asset + ".manifest"))
    {
        uwr.downloadHandler = new DownloadHandlerFile(path + "/" + asset + ".manifest");
        yield return uwr.SendWebRequest();

        if ( uwr.isNetworkError || uwr.isHttpError )
        {
            Debug.Log(uwr.error);
        }
    }
}

下载后有一种检查方法:

    AssetBundle manifestBundle = AssetBundle.LoadFromFile(Path.Combine(path, asset));
    AssetBundleManifest manifest = manifestBundle.LoadAsset<AssetBundleManifest>("asset.manifest");

我完全迷路了。我通过了google,但无法正常工作。我不明白为什么它不起作用。我以相同的方式加载资产,没有任何问题,Unity文档说资产必须以相同的方式运行。来自Unity文档:Loading the manifest itself is done exactly the same as any other Asset from an AssetBundle

1 个答案:

答案 0 :(得分:0)

您需要在 AssetBundle.LoadFromFile 中加载的文件是在您存储 AssetBundle 的同一文件夹中生成的文件。该文件与存储文件夹的名称相同。例如,如果您在名为 maps 的文件夹中生成了一个名为 bundles 的 AssetBundle,那么将同时生成一个文件 bundlesmaps。这样,在 AssetBundle.LoadFromFile 中,您必须加载文件 bundles。在任何情况下,您都必须加载任何 .manifest 文件。你的代码应该是这样的:

IEnumerator GetManifest(string animal)
{
    using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle("http://weppage.com/" + asset))
    {
        uwr.downloadHandler = new DownloadHandlerFile(path + "/" + asset);
        yield return uwr.SendWebRequest();

        if ( uwr.isNetworkError || uwr.isHttpError )
        {
            Debug.Log(uwr.error);
        }
    }
}

下载后的检查方法:

AssetBundle manifestBundle = AssetBundle.LoadFromFile(Path.Combine(path, "bundles")); //the name of the example file I gave you
AssetBundleManifest manifest = manifestBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");