郑重声明:转载请注明出处 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. Linux(Centos7)yum安装最新redis

    正如我们所知的那样,Redis是一个开源的.基于BSD许可证的,基于内存的.键值存储NoSQL数据库.Redis经常被视为一个数据结构服务器,因为Redis支持字符串strings.哈希hashes. ...

  2. c# 反射取其他项目的资源文件

    反射获取其他项目里面的资源文件. dll或exe里面 try { System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFil ...

  3. PTC FlexPLM rfa 常用功能api

    1.根据款号查询产品 public LCSProduct GetProductByName(String SKC) throws WTException { //声明查询 PreparedQueryS ...

  4. css限制显示字数,文字长度超出部分用省略号表示【转】

    为了保证页面的整洁美观,在很多的时候,我们常需要隐藏超出长度的文字.这在列表条目,题目,名称等地方常用到. (1).文字超出一行,省略超出部分,显示'...' 如果这种情况比较多,可以取一个切合作用的 ...

  5. 如何将baidu地图中的baidu logo 去掉

    今天我的老大问我是不是可以将baidumap 的js版中baidu logo 去掉.我上网查询一下,有各种方法,比如将对应的logo div remove hide 等等,这些都是需要JS 函数触发执 ...

  6. Python 内置方法new

    class Dog(object): def __new__(self): print("i am new .") def __init__(self): print(" ...

  7. htop VS top

    在 Linux 系统中,top 命令用来显示系统中正在运行的进程的实时状态,它显示了一些非常有用的信息,比如 CPU 利用情况.内存消耗情况,以及每个进程情况等.但是,你知道吗?还有另外一个命令行工具 ...

  8. 关于Unity中的旋涡特效的制作(捕鱼达人3技术)(专题八)

    Mesh--材质--Shader 1: Mesh 是网格,包括顶点,法线,纹理坐标,切线,三角形.在每一个3D模型节点里面,有一个Mesh Filter组件来提取模型里面的网格数据;2: Shader ...

  9. Linux中的绝对路径和相对路径

    一.介绍 1,文件路径 什么是文件的路径? 答:这个文件存放的地方,可以联想为 文件的“家”. 在Linux中,存在着绝对路径和相对路径 绝对路径:路径的写法一定是由根目录 / 写起的,例如 /usr ...

  10. 【转载】C#之玩转反射

    前言 之所以要写这篇关于C#反射的随笔,起因有两个:   第一个是自己开发的网站需要用到   其次就是没看到这方面比较好的文章. 所以下定决心自己写一篇,废话不多说开始进入正题. 前期准备 在VS20 ...