郑重声明:转载请注明出处 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. opencv 中affine函数实现旋转和平移

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

  2. Access restriction: The method typeNameToClass(String) from the type ObjectHandler is not accessible due to restriction on required library

    异常: Access restriction: The method typeNameToClass(String) from the type ObjectHandler is not access ...

  3. php 根据身份证获取出身地址

    <?php /**根据身份证算出地址****/ class addr{ /**获取省***/ public function get_shenfen($id){ //截取前两位数 $index ...

  4. Android开发 sharesdk分享微信/朋友圈的时候只显示文字,不显示链接

    问题:分享的时候只将分享的content分享出去了,连标题及链接都没有分享出去. 原因:没有配置image导致. 解决办法: 在  showShare 方法里面添加配置: if(ImageUrlOrP ...

  5. combobox无法显示选中的数据,都是undefined

    $('#firstfactor').combobox({                url: '@Url.Action("GetMultiAirFactor_Day_New", ...

  6. 自然语言交流系统 phxnet团队 创新实训 项目博客 (七)

    在本项目中使用到的“语音转文本”的技术总结: 语音转文本部分是调用的科大讯飞的在线语音,它的激发方式是按键,通过按钮触发开启安卓设备的录音,此部分需要在源码中写入关于安卓权限的要求,来调用安卓的录音权 ...

  7. 关于Unity中关节的使用(二)

    导入 1.创建工程 2.导入joint_scene.unitypackage 3.运行发现机械爪子摇来摇去,因为line节点下面的子节点之间相互碰撞带动的关系 4.为了消除这种乱摇,我们在右上角添加一 ...

  8. 【6】JVM-内存分配与回收策略

        JAVA技术体系中的自动内存管理实际上就是自动化的解决了给对象分配内存以及回收给对象分配的内存这两个问题.回收部分通过之前的<GC设计思路分析>和<垃圾收集器>这两篇博 ...

  9. SAP Actual Costing with Material Ledger 激活实际成本后台配置

    Actual Costing with Material Ledger 1      Purpose This configuration guide provides the information ...

  10. WFA 认证 启动 sigma_dut方法

    WFA认证需要启动sigma_dut,记录记录一下启动过程. Android O平台命令如下 adb shell svc wifi disable adb shell rmmod wlan adb s ...