在硬盘中下载 AssetBundle

Posted

技术标签:

【中文标题】在硬盘中下载 AssetBundle【英文标题】:Download AssetBundle in hard disk 【发布时间】:2018-08-25 12:24:00 【问题描述】:

现在,似乎UnityWebRequest.GetAssetBundledownload 资产到 RAM 并加载。有没有办法下载到硬盘加载?

【问题讨论】:

【参考方案1】:

这并不复杂。像处理从 Internet 下载的普通文件一样处理它,但使用 ".unity3d" 扩展名保存它。

1.通过UnityWebRequest发出请求,将AssetBundle作为普通文件下载。

UnityWebRequest www = UnityWebRequest.Get(url);
yield return www.Send();

2.用DownloadHandler.data检索字节数组数据,然后保存到Application.persistentDataPath/yourfolder/filename.unity3d。确保扩展名是 ".unity3d".

File.WriteAllBytes(handle.data, data);

就是这样。

3.要加载数据,请使用AssetBundle.LoadFromFileAssetBundle.LoadFromFileAsync

AssetBundleCreateRequest bundle = AssetBundle.LoadFromFileAsync(path);

如果仍然感到困惑,这就是事情的样子。您可能需要进行一些修改:

下载并保存:

IEnumerator downloadAsset()

    string url = "http://url.net/YourAsset.unity3d";

    UnityWebRequest www = UnityWebRequest.Get(url);
    DownloadHandler handle = www.downloadHandler;

    //Send Request and wait
    yield return www.Send();

    if (www.isError)
    

        UnityEngine.Debug.Log("Error while Downloading Data: " + www.error);
    
    else
    
        UnityEngine.Debug.Log("Success");

        //handle.data

        //Construct path to save it
        string dataFileName = "WaterVehicles";
        string tempPath = Path.Combine(Application.persistentDataPath, "AssetData");
        tempPath = Path.Combine(tempPath, dataFileName + ".unity3d");

        //Save
        save(handle.data, tempPath);
    


void save(byte[] data, string path)

    //Create the Directory if it does not exist
    if (!Directory.Exists(Path.GetDirectoryName(path)))
    
        Directory.CreateDirectory(Path.GetDirectoryName(path));
    

    try
    
        File.WriteAllBytes(path, data);
        Debug.Log("Saved Data to: " + path.Replace("/", "\\"));
    
    catch (Exception e)
    
        Debug.LogWarning("Failed To Save Data to: " + path.Replace("/", "\\"));
        Debug.LogWarning("Error: " + e.Message);
    

加载

IEnumerable LoadObject(string path)

    AssetBundleCreateRequest bundle = AssetBundle.LoadFromFileAsync(path);
    yield return bundle;

    AssetBundle myLoadedAssetBundle = bundle.assetBundle;
    if (myLoadedAssetBundle == null)
    
        Debug.Log("Failed to load AssetBundle!");
        yield break;
    

    AssetBundleRequest request = myLoadedAssetBundle.LoadAssetAsync<GameObject>("boat");
    yield return request;

    GameObject obj = request.asset as GameObject;
    obj.transform.position = new Vector3(0.08f, -2.345f, 297.54f);
    obj.transform.Rotate(350.41f, 400f, 20f);
    obj.transform.localScale = new Vector3(1.0518f, 0.998f, 1.1793f);

    Instantiate(obj);

    myLoadedAssetBundle.Unload(false);

【讨论】:

谢谢,如果我要在移动设备上运行,您建议存储在哪里?持久数据路径?如果我想替换旧版本的assetbundle也会有问题,例如我有assetbundle1_01,然后我检测更新并下载assetbundle1_02,如果用户不给我写权限,那会有问题吗? 是的,使用 persistentDataPath。请注意,您必须在其中创建一个文件夹并存储在该文件夹中。不要直接保存到 persistentDataPath 路径。应该是Application.persistentDataPath/yourfolder/filename.ext。您可以随时将文件替换为新版本。最后在保存功能中有trycatch 代码。如果有异常,可以在catch`块中查看,并要求用户开启写权限。如果他们不想让你写,你就不能写到别人的设备上。 如果您在android上遇到问题,请务必将“写入权限”更改为“外部(SDCard)” 谢谢,我会的,我想知道你有没有机会知道如何从 Android 中的 streamingAssets 加载?我尝试了“jar:file://”+ Application.dataPath +“!/assets/”+ myassetbundle 名称,使用 LoadFromCacheOrDownload,我无论如何都找不到该文件。它与签名的apk有关吗?我应该改用 dataPath + signedKey + "!/assets/" 吗? 我认为您应该将此作为一个新问题发布,标题为“从流资产加载资产”。您必须发布您正在使用的代码,并提及哪些不起作用,我会看看。并且最好提及您的 Unity 版本,这非常重要。

以上是关于在硬盘中下载 AssetBundle的主要内容,如果未能解决你的问题,请参考以下文章

google 云端硬盘中的文件无法下载

游戏可以下载到机械硬盘然后安装在固态硬盘里可以吗

如何从Google云端硬盘下载csv文件以在移动应用中显示内容

xss下载到外接硬盘下载速度慢

xss下载到外接硬盘下载速度慢

如何查看MAC下硬盘编号??