unity下载模型到本地并加载

WWW类的下载与加载

从服务器上下载模型

//下载网络模型并缓存到本地
IEnumerator LoadAndSaveAsset(string name)  
{
    string url = null;
    string progress = null;
#if UNITY_ANDROID && !UNITY_EDITOR
    url = @"http://localhost/AssetBundles/android/"+name+"/assetbundle.model";
#elif UNITY_IPHONE && !UNITY_EDITOR
    url = @"http://localhost/AssetBundles/ios/"+name+"/assetbundle.model";
#else
    url = @"http://localhost/AssetBundles/windows/"+name+"/assetbundle.model";
#endif
    Debug.Log(url);
    Debug.Log("开始下载模型。");
    WWW w = new WWW(url);
    while (!w.isDone)
    {
        progress = (((int)(w.progress * 100)) % 100) + "%";
        loadText.text = "下载模型中" + progress;
        yield return null;
    }
    yield return w;
    if (w.isDone)
    {
        loadText.text = "保存模型中";
        byte[] model = w.bytes;
        int length = model.Length;

        //文件流信息  
        Stream sw;
        
        DirectoryInfo t = new DirectoryInfo(Application.persistentDataPath + "/model/" + name);
        if (!t.Exists)
        {
            //如果此文件夹不存在则创建  
            t.Create();
        }
        FileInfo j = new FileInfo(Application.persistentDataPath + "/model/" + name + "/" + "assetbundle.model");
        if (!j.Exists)
        {
            //如果此文件不存在则创建  
            sw = j.Create();
        }
        else
        {
            //如果此文件存在则打开  
            sw = j.OpenWrite();
        }
        sw.Write(model, 0, length);
        //关闭流  
        sw.Close();
        //销毁流  
        sw.Dispose();
    }
}

DirectoryInfo实例的对象来判断文件夹是否存在,FileInfo实例的对象来判断文件是否存在,文件夹创建的方法无返回值,而文件的创建方法返回值是Stream的派生类FileStream类型。

加载网络模型

IEnumerator LoadModel(string url)
{
    string progress = null;
    WWW w = new WWW(url);
    while (!w.isDone)
    {
        progress = (((int)(w.progress * 100)) % 100) + "%";
        loadText.text = "加载模型:" + progress;
        yield return null;
    }
    yield return w;
    if (w.error != null)
    {
        Debug.Log("error:" + w.url + "\n" + w.error);
    }
    else
    {
        AssetBundle bundle = w.assetBundle;
        GameObject modelPre = bundle.LoadAsset<GameObject>("model");
        GameObject modelClone = Instantiate(modelPre);
    }
}

加载本地模型

Application.persistentDataPath路径是一个可读可写的物理路径,是真实存在的,是安装后生成的路径。

IEnumerator LoadModel(string name)
{
    string s = null;
    string progress = null;
#if UNITY_ANDROID && !UNITY_EDITOR
    s = "file://" + Application.persistentDataPath + "/" + name;
#elif UNITY_IPHONE && !UNITY_EDITOR
    s = "file://" + Application.persistentDataPath + "/" + name;  
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
    //windows的file协议可能从"file://"变成了"file:///"三斜杠
    s = "file://" + Application.persistentDataPath + "/" + name;  
#endif
    WWW w = new WWW(s);
    while (!w.isDone)
    {
        progress = (((int)(w.progress * 100)) % 100) + "%";
        loadText.text = "加载模型:" + progress;
        yield return null;
    }
    yield return w;
    if (w.error != null)
    {
        Debug.Log("error:" + w.url + "\n" + w.error);
    }
    else
    {
        AssetBundle bundle = w.assetBundle;
        GameObject modelPre = bundle.LoadAsset<GameObject>("model");
        GameObject modelClone = Instantiate(modelPre);
    }
    Debug.Log(s);
}

Application.StreamingAssetsPath路径在移动端是一个只读的路径,是StreamingAssets文件夹编译后的路径。

IEnumerator LoadModel(string name)
{
    string s = null;
    string progress = null;
#if UNITY_ANDROID && !UNITY_EDITOR
    s = "jar:file://" + Application.streamingAssetsPath + "/" + name;
#elif UNITY_IPHONE && !UNITY_EDITOR
    s = "file://" + Application.streamingAssetsPath + "/" + name;  
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
    //windows的file协议可能从"file://"变成了"file:///"三斜杠
    s = "file://" + Application.streamingAssetsPath + "/" + name;  
#endif
    WWW w = new WWW(s);
    while (!w.isDone)
    {
        progress = (((int)(w.progress * 100)) % 100) + "%";
        loadText.text = "加载模型:" + progress;
        yield return null;
    }
    yield return w;
    if (w.error != null)
    {
        Debug.Log("error:" + w.url + "\n" + w.error);
    }
    else
    {
        AssetBundle bundle = w.assetBundle;
        GameObject modelPre = bundle.LoadAsset<GameObject>("model");
        GameObject modelClone = Instantiate(modelPre);
    }
    Debug.Log(s);
}

值得注意的是安卓端Application.persistentDataPath前面没有加"jar:",而Application.StreamingAssetsPath路径前面却是加了"jar:"的。

2019年3.8修正 :最近重新打开旧发布的商业项目,准备第二期开发 ,换了电脑,重新装的unity发现,Windows加载本地文件的方式改了,file协议好像从"file://"变成了"file:///"三斜杠开头,其他平台没变,很大可能是我没免转义,不深究了

Unity中,你可以使用WWW类来下载文件到本地。首先,你需要指定要下载的文件的URL地址。然后,你可以使用WWW类的构造函数来创建一个WWW对象,并将URL作为参数传递进去。接下来,你可以使用WWW对象的Download方法来开始下载文件。下载完成后,你可以使用WWW对象的bytes属性来获取下载的文件数据。最后,你可以将文件保存到本地磁盘上。以下是一个示例代码,演示了如何使用WWW类来下载文件到本地: ```csharp IEnumerator DownloadFile(string url, string savePath) { // 创建一个WWW对象,并指定要下载的文件的URL地址 WWW www = new WWW(url); // 等待下载完成 yield return www; // 检查是否有错误发生 if (string.IsNullOrEmpty(www.error)) { // 下载成功,将文件保存到本地磁盘上 File.WriteAllBytes(savePath, www.bytes); Debug.Log("文件下载成功!"); } else { // 下载失败,打印错误信息 Debug.LogError("文件下载失败:" + www.error); } } ``` 你可以将上述代码放在一个协程中调用,以便在Unity中异步下载文件。在调用DownloadFile方法时,你需要传递要下载的文件的URL地址和保存文件的路径。请确保在使用该代码之前,你已经导入了System.IO命名空间,以便使用File类来保存文件到本地磁盘上。 参考资料: \[1\] unity下载模型到本地加载_我无方位盲猜吉凶的博客-CSDN博客 \[2\] unity下载模型到本地加载 - CSDN搜索 \[3\] 在Unity下载文件到本地 - CSDN博客 #### 引用[.reference_title] - *1* *2* [unity下载模型到本地加载](https://blog.csdn.net/qq_40544338/article/details/124556109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [unity从服务器下载资源并且存储到本地](https://blog.csdn.net/qq_31157943/article/details/103355904)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值