Unity批量下载、限制同时下载量、下载过的不下载

  • 格式:docx
  • 大小:18.83 KB
  • 文档页数:10

今天我们来讲讲WWW下载、下载量以及查重。 一、我们一步一步来,先从WWW下载开始,这个很简单,我之前的文章里也有讲过。核心部分就是 www = new WWW(url); 是不是很简单,那么我们怎么把下载下来的资源保存起来呢

1、先定义文件流 Stream sw; 2、然后定义文件信息 FileInfo t;用来保存资源的路径 说到路径,我们需要有个路劲赋值给 t,那么就是FileInfo t = new FileInfo(path);

3、有了路径那么我们就可以进行存储了,上面定义的Stream sw就可以用了 sw.Write(info,0,length); info是byte[]类型等于www.bytes length是int类型等于info.length 4、写完流之后就是关闭和销毁啦 sw.Close(); sw.Dispose(); 这样我们就完成了保存资源的工作 二、下面我们来通过读取XML文件来获取WWW的path 1、XML文件我们先写个根元素Resources,然后写个子元素url。在子元素url中我们获取它的文本内容,这边文本内容就写我们的资源链接。

那么规格就是: 链接地址 ………… ………… 链接地址 我们有多少资源就需要就需要添加相对应的url元素。 2、配置好XML文件后我们就开始获取XML文件中的信息了,那么我们先怎么获取到XML文件呢

这里我们会用到XMLDocument类,在实例化类之前我们需要先添加引用System.Xml,不然是无法找到XMLDocument类的。如果有不了解XMLDocument类的可以先去了解下,其实我也不了解,一般都是用到了才会去接触,而且只接触自己需要用到的,这不是好的习惯,大家不要学习。

XMLDocument xmlDoc = new XMLDocument(); 3、实例化之后我们就应该去访问啦,访问当然需要有个访问地址吧 xmlDoc.Load(XML文件所在的地址); 我把XML文件就放在Unity工程中,那么地址就是Application.dataPath + @"/Resources.xml"

4、然后我们就可以访问XML文件了,遍历子元素。这里用到了XmlNodeList XmlNodeList nodeLlist=xmlDoc.SelectSingleNode("Resources").ChildNode;

这里的Resources是根元素 5、下面我们遍历nodeList foreach (XmlElement url in nodeList) { _url = url.InnerText; } url.InnerText就是url元素的文本内容 6、处理好了XML读取和WWW下载,下面我们就可以将它们合二为一:批量下载

这也很简单,把WWW下载放到foreach遍历中可以了。 这里说下,现在的遍历下载是遍历一个下载一个,这样是特别好性能的。如果只有几个链接还好,资源链接一多那样基本就跑不动了。这对客户端和服务端都造成了压力。

三、根据上面说的,下面我们要对同时下载量做一个控制。遍历一个链接,下载一个资源,当下载完成时返回信息,遍历下一个链接下载,依次循环。

1、根据这样的思路我们应该怎么做呢,我们抛开上面的,先来个简单的一个案例for循环怎么在Start()方法中每隔一秒打印for循环的内容呢

for(int i;i<5;i++) { print(i); } 我们怎么才能让他每隔一秒打印呢 这里我们就用到了协程 yield return new WaitForSecond(1); 这样就可以间隔一秒打印一次了 2、foreach也是这样的原理,只不过这里我们返回的是WWW 四、最后我们来查找资源是否存在 1、查重我们应该在获取资源链接之后、下载资源之前做 这里我们会用到DirectorInfo类和FileInfo类 实例化DirectoryInfo将保存资源的路径赋值给它 DirectoryInfo di = new DirectoryInfo(Application.persistentDataPath); 2、然后我们遍历di 上面是遍历链接 foreach (FileInfo fi in di.GetFiles()) { if (下载资源命名==保存资源命名) { //print("已下载:"+urlName); yield break;//终止循环遍历 不做往下操作 } } 下面是WWW下载 3、这样就完成了所有的操作

五、最后附上完成的代码 /* 主要功能:遍历XML文件内容 批量下载 下载个数限制(同时只能下载一个文件) 遍历文件夹查找是否存在该资源 */ using UnityEngine; using System.Collections; using System.IO; using System.Xml;

publicclassWWWDatchDownloading : MonoBehaviour { privatestring _url; privateWWW www;

publicvoid OnButton() { StartCoroutine(showXml()); }

/// /// 读xml /// IEnumerator showXml() { //xml保存的路径,这里放在Assets路径 注意路径。 #if UNITY_ANDROID string filepath = Application.persistentDataPath + @"/Resources.xml"; #endif

#if UNITY_IPHONE string filepath = Application.persistentDataPath + @"/Resources.xml"; #endif

#if UNITY_EDITOR filepath = Application.dataPath + @"/Resources.xml"; #endif

#region 继续判断当前路径下是否有该文件 if (File.Exists(filepath)) { //创建XML文档实例 XmlDocument xmlDoc = newXmlDocument(); //根据路径将XML读取出来 xmlDoc.Load(filepath); //得到Home下的所有子节点 XmlNodeList nodeList = xmlDoc.SelectSingleNode("Resources").ChildNodes; //遍历所有Home子节点 foreach (XmlElement url in nodeList) { _url = url.InnerText; //print("正在下载中:"_url); StartCoroutine(loadasset(_url));

//协程 当下载完成时下载下一个资源 yieldreturn www; } } #endregion

}

/// /// 下载 写入资源到本地 /// ///链接 /// IEnumerator loadasset(string url) { //下载工作之前先判断有没有下载资源 //如果有就不下载 并跳到下个下载链接 //如果没有就下载 并保存资源

//取后16个字符 string urlName = url.Substring(url.Length - 16);

FileInfo t = newFileInfo(Application.persistentDataPath + "//" + urlName); //判断当前是否有此文件 如果没有就下载,如果有就跳过 if (!t.Exists) { www = newWWW(url); yieldreturn www; //如果下载完成 做保存资源工作 if (www.isDone) { byte[] model = www.bytes; int length = model.Length; //写入文件到本地 CreateModelFile(Application.persistentDataPath, urlName, model, length); } } else print("已下载:" + urlName); }

/// /// 创建资源 /// ///文件位置 ///文件名 ///字节 ///长度 void CreateModelFile(string path, string name, byte[] info, int length) { //文件流信息 Stream sw; FileInfo t = newFileInfo(path + "//" + name); if (!t.Exists) //如果此文件不存在则创建 sw = t.Create(); else return;

//以行的形式写入信息 //sw.WriteLine(info); sw.Write(info, 0, length); //关闭流 sw.Close(); //销毁流 sw.Dispose(); }

///