郑重声明:转载请注明出处 U_探索

本文诞生于乐元素面试过程,被面试官问到AssetBundle多线程异步下载时,愣了半天,同样也被深深的鄙视一回(做了3年多u3d 这个都没用过),所以发誓要实现出来填补一下自己的空白,同时分享给大家。说明:本人只在pc和Android下测试好使,其他平台未知!

直接贴代码,都是C# http的API,不懂得自己百科。

using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.Net;
using System.IO; internal class WebReqState
{
public byte[] Buffer; public FileStream fs; public const int BufferSize = ; public Stream OrginalStream; public HttpWebResponse WebResponse; public WebReqState(string path)
{
Buffer = new byte[];
fs = new FileStream(path,FileMode.Create);
} } public class HttpHelper { string path = null;
string assetName;
public HttpHelper(string path)
{
this.path = path;
} public void AsyDownLoad(string url)
{
Debug.Log(url);
assetName = url.Split('/')[];
Debug.Log(assetName);
HttpWebRequest httpRequest = WebRequest.Create(url) as HttpWebRequest;
httpRequest.BeginGetResponse( new AsyncCallback(ResponseCallback), httpRequest);
} void ResponseCallback(IAsyncResult ar)
{
HttpWebRequest req = ar.AsyncState as HttpWebRequest;
if(req == null) return;
HttpWebResponse response = req.EndGetResponse(ar) as HttpWebResponse;
if(response.StatusCode != HttpStatusCode.OK)
{
response.Close();
return;
}
Debug.Log(path+ "/"+assetName);
WebReqState st = new WebReqState(path+ "/"+assetName);
st.WebResponse = response;
Stream responseStream = response.GetResponseStream();
st.OrginalStream = responseStream;
responseStream.BeginRead(st.Buffer,,WebReqState.BufferSize,new AsyncCallback(ReadDataCallback),st);
} void ReadDataCallback(IAsyncResult ar)
{
WebReqState rs = ar.AsyncState as WebReqState;
int read =rs.OrginalStream.EndRead(ar);
if(read>)
{
rs.fs.Write(rs.Buffer,,read);
rs.fs.Flush();
rs.OrginalStream.BeginRead(rs.Buffer, , WebReqState.BufferSize, new AsyncCallback(ReadDataCallback), rs);
}
else
{
rs.fs.Close();
rs.OrginalStream.Close();
rs.WebResponse.Close();
Debug.Log(assetName+":::: success");
}
}
}

下载部分:

if(GUI.Button(new Rect(,,,),"test"))
{
string rootPath = Application.persistentDataPath;//android上保存到 /storage/sdcard0/Android/data/包名(例如:com.example.test)/files
for(int i =;i<str.Length;i++) //str是string型数组,存放部分assetbundle名字
{
Thread thread = new Thread(new ParameterizedThreadStart(DownAsset)); //ParameterizedThreadStart 多线程传参
thread.Start(rootPath+"|"+str[i]); //只能带一个object参数 所以使用字符串拼接
}
} void DownAsset(System.Object file)
{
string[] fileName = file.ToString().Split('|');
HttpHelper help = new HttpHelper(fileName[]);
help.AsyDownLoad("http://192.168.0.103/unity/"+fileName[]+".AssetBundle");//注意在手机上测试 该对Ip地址
}

下载完成后 可以去/storage/sdcard0/Android/data/包名(例如:com.example.test)/files查找对应文件

加载部分:

if(GUI.Button(new Rect(,,,),"load"))
{
for(int i =;i<str.Length;i++)
{
StartCoroutine(LoadAsset(str[i],i));
}
}
IEnumerator LoadAsset(string name,int i)
{
WWW w = new WWW("file://"+Application.persistentDataPath+"/"+name+".AssetBundle");
yield return w;
Instantiate(w.assetBundle.mainAsset,new Vector3(i*,,),Quaternion.identity);
w.assetBundle.Unload(false);
}

注意事项:

1、pc测试 需要修改IP地址,本地测试改为127.0.0.1 同时Application.persistentDataPath最好做修改,因为在pc上Application.persistentDataPath:C:\Users\用户名\AppData\LocalLow\DefaultCompany\u3d工程名,可以下载到此文件夹下,但是加载的时候会报错,没什么权限之类的

2、android上需要stripping level设置为Disabled

[原]unity3d之http多线程异步资源下载的更多相关文章

  1. Cocos2d-x 3.0多线程异步资源载入

    Cocos2d-x从2.x版本号到上周刚刚才公布的Cocos2d-x 3.0 Final版,其引擎驱动核心依然是一个单线程的"死循环".一旦某一帧遇到了"大活儿" ...

  2. Cocos2d-x 3.0多线程异步资源载入代码

    // AppDelegate.cpp bool AppDelegate::applicationDidFinishLaunching() { - - FlashScene* scene = Flash ...

  3. unity3d中asset store 的资源下载到本地的目录位置

    来源:http://blog.csdn.net/fzhlee/article/details/8613688 C:/Users/[当前用户]/AppData/Roaming/Unity/Asset S ...

  4. 【iOS系列】-多图片多线程异步下载

    多图片多线程异步下载 开发中非常常用的就是就是图片下载,我们常用的就是SDWebImage,但是作为开发人员,不仅要能会用,还要知道其原理.本文就会介绍多图下载的实现. 本文中的示例Demno地址,下 ...

  5. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  6. 可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui)

    可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ...

  7. Android 学习笔记之使用多线程实现断点下载...

    PS:莫名其妙的迷茫... 学习内容: 1.使用多线程实现文件下载...   多线程下载是加快下载速度的一种方式..通过开启多个线程去执行一个任务..可以使任务的执行速度变快..多线程的任务下载时常都 ...

  8. Android 多线程 异步加载

    Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...

  9. 异步图片下载引擎(升级版——ExecutorService+handler)

    [Android分享] 异步图片下载引擎(升级版——ExecutorService+handler)  [复制链接]     皮诺 13 主题 5 好友 844 积分 No.4 中级开发者 升级  2 ...

随机推荐

  1. 【转】使用lockbits方法处理图像

    许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高得多. 你可能会发现DotNet采用托管机制, ...

  2. 【C】——setvbuf(scanf内存溢出问题)

    下面设置了一个长度为20的缓存区,循环对value进行赋值并输出: #include<stdio.h> #define BUFSIZE 20 int main(int argc, char ...

  3. 解决Android 7.0 App内切换语言不生效的问题

    Android7.0及以前版本,Configuration中的语言相当于是App的全局设置: public static void changeAppLanguage(Context context, ...

  4. loadrunner 中Error和failed transaction 的区别

    Down:没有运行 Pending:挂起 Init:初始化 Ready:准备就绪 Run:正在运行 Rendezvous:正在集结 Passed:运行通过 Failed:运行失败 Error:出现故障 ...

  5. 如何通过使用窗体身份验证和 Visual C#.NET 对 Active Directory 验证身份

    本分步指南演示如何在 ASP.NET 应用程序如何使用窗体身份验证允许用户使用轻型目录访问协议 (LDAP),对 Active Directory 进行验证.经过身份验证的用户重定向之后,可以使用Ap ...

  6. 命令行模式启动VMWare虚拟机

    工作中使用到在centos中安装vmware Workstation部署虚拟机,以前都是使用图形界面启动虚拟机,由此要调整VNC的分辨率大小,重启VNC Server后所有虚拟机都关闭了.事后分析可能 ...

  7. 实验一 ASP.NET应用环境配置 总结

    通过本次实验我学会了在Windows XP系统中安装IIS服务器,虽然我的电脑是Windows7系统,但是通过虚拟机软件,配置了一台Windows XP系统的虚拟机,在虚拟机内进行各项配置操作.这次实 ...

  8. python 查看目录下所有目录和文件

    python查看目录下所有的子目录和子文件 python递归遍历目录结构 我喜欢第一种 方法1 import json, os def list_dir(path, res): for i in os ...

  9. Numpy 的数学和统计方法

    可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算.sum.mean以及标准差std等 聚合计算(aggregation, 通常叫做约简(reduction))既可以当做数组的实例方法 ...

  10. CI框架 -- 核心文件 之 Output.php(输出类文件)

    CI输出类Output.php的功能是将最终web页面发送给浏览器,这里面的东西可能是你用的最少的.你使用装载器加载了一个视图文件, 这个视图文件的内容会自动传递给输出类对象, 然后呢,在方法执行完毕 ...