郑重声明:转载请注明出处 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 = 1024;public Stream OrginalStream;public HttpWebResponse WebResponse;public WebReqState(string path){Buffer = new byte[1024];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('/')[4];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,0,WebReqState.BufferSize,new AsyncCallback(ReadDataCallback),st);
}void ReadDataCallback(IAsyncResult ar)
{WebReqState rs = ar.AsyncState as WebReqState;int read =rs.OrginalStream.EndRead(ar);if(read>0){rs.fs.Write(rs.Buffer,0,read);rs.fs.Flush();rs.OrginalStream.BeginRead(rs.Buffer, 0, WebReqState.BufferSize, new AsyncCallback(ReadDataCallback), rs);}else{rs.fs.Close();rs.OrginalStream.Close();rs.WebResponse.Close();Debug.Log(assetName+":::: success");}
}
}

View Code

下载部分:

if(GUI.Button(new Rect(0,0,100,30),"test"))
{string rootPath = Application.persistentDataPath;//android上保存到 /storage/sdcard0/Android/data/包名(例如:com.example.test)/filesfor(int i =0;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[0]);help.AsyDownLoad("http://192.168.0.103/unity/"+fileName[1]+".AssetBundle");//注意在手机上测试 该对Ip地址
}

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

加载部分:

if(GUI.Button(new Rect(0,30,100,30),"load"))
{for(int i =0;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*2,0,0),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

转载于:https://www.cnblogs.com/U-tansuo/p/unity3d_Threading_AsyDown_HTTP.html

[原]unity3d之http多线程异步资源下载相关推荐

  1. 3D引擎多线程:资源异步加载

    本文原创版权归 博客园 flagship 所有,如有转载,请详细标明作者及原文出处,以示尊重! 作者:flagship 原文:3D引擎多线程:资源异步加载 资源异步加载恐怕是3D引擎中应用最为广泛的多 ...

  2. ubuntu资源下载利器:多线程、断点续传下载工具mwget的安装与使用

    ubuntu资源下载利器:多线程.断点续传下载工具mwget的安装与使用

  3. 《PHP和MySQL Web 开发,原书第4版》光盘/源代码/资源/下载

    <PHP和MySQL Web 开发,原书第4版> 光盘/源代码/资源/下载 http://www.china-pub.com/195187&ref=ps 下载您需要的更新文件(包括 ...

  4. Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)

    文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...

  5. Visual C++串口通信编程---多线程异步方式

    Visual C++串口通信编程---多线程异步方式 1. 串口通信基础 提到串口让人想起并口,它们是计算机中两个比较重要的通信方式. 串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占 ...

  6. Fork and Join: Java也可以轻松地编写并发程序 原文地址 作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zi

    Fork and Join: Java也可以轻松地编写并发程序 原文地址   作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) ...

  7. Python爬虫【四】爬取PC网页版“微博辟谣”账号内容(selenium多线程异步处理多页面)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  8. 高并发多线程分片断点下载

    基于Java的高并发多线程分片断点下载 首先直接看测试情况: 单线程下载72MB文件 7线程并发分片下载72MB文件: 下载效率提高2-3倍,当然以上测试结果还和设备CPU核心数.网络带宽息息相关. ...

  9. 医学教育网批量资源下载程序之——完成

    2019独角兽企业重金招聘Python工程师标准>>> 大家好! 经过好长时间的拆腾,终于实现了 "医学教育网批量资源下程序" . 相关的博文: 医学教育网批量资 ...

最新文章

  1. web设计经验一 提升移动设备响应式设计的8个建议
  2. C++走向远洋——61(项目一、排序函数模板)
  3. hdu4530 水题
  4. JVM(一) ---JVM的数据模型
  5. VTK:图片之ImageValueRange
  6. SQL Server Management Studio消失了
  7. Android-TextView跑马灯效果
  8. docker安装rabbitmq步骤
  9. Git GUI,Git Bash,Git CMD标签之间的区别
  10. NSS_08 extjs表单验证
  11. iOS获取iPhone系统等信息和服务器返回空的异常处理
  12. QA面试题:之一(中英文题目、难度:简单)
  13. git2.23.0下载git2.25.0下载git2.27.0下载百度云
  14. 利用Eigen求广义逆矩阵
  15. Linux 系统编程 --文件IO-write()、read()、lseek()函数
  16. 发光环绕文字特效怎么做?教程来了
  17. 新生儿的二类(自费)疫苗(截止2019年)
  18. 【算法编程】乘方取模
  19. 基于SSM大学生宿舍交电费系统
  20. explain的使用及详解

热门文章

  1. 阿里云如何将服务器添加至跳板机,如何将服务器添加至jumpsever
  2. 基于Golang的CLI 命令行程序开发
  3. JVM 常见异常及内存诊断
  4. 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
  5. 2022-2028年中国橡胶带行业市场运营格局及未来前景分析报告
  6. docker run 或者 docker restart 启动镜像就自动退出
  7. SSM框架整合(Spring+SpringMVC+MyBatis)
  8. Lidar激光雷达市场
  9. Wide Deep的OneFlow网络训练
  10. MindSpore特性支持类