版本:Unity2018.1.3
1、www的使用
www下载资源有两种方式。
1、直接用构造函数。传入需要下载的URL。等待www下载完成。这种方法是直接用www加载到内存里
public IEnumerator DownLoadRes(string url)
{
WWW www = new WWW(url);
yield return www;
//ToDo
}
2、使用静态方法LoadFromCacheOrDownload。此方法是把资源下载到磁盘缓存。在内存里面创建一个较小的SerializedFile。后续通过IO来读取数据
2、读取StreamingAssets里面的数据
在移动平台上。一般会把StreamingAssets文件夹中的资源拷贝到persistentDataPath里面。但是StreamingAssets是不能通过IO来读取的。所以我们可以用www的方式来读取StreamingAssets里面的数据。并保存到persistentData文件夹里面
用www下载。首先要获取下载的路径。由于是在本地。不同平台所要加的前缀不一样。可以参照如下函数:
string getStreamingPath_for_www()
{
string pre = "file://";
#if UNITY_EDITOR
pre = "file://";
#elif UNITY_
pre = "";
#elif UNITY_IPHONE
pre = "file://";
#endif
string path = pre + Application.streamingAssetsPath + "/";
return path;
}
这个函数的作用是获取不同平台下面。StreamingAssets文件夹路径的包装。以便能被www使用
具体的拷贝函数如下:
IEnumerator copy(string fileName)
{
string src = getStreamingPath_for_www() + fileName;
string des = Application.persistentDataPath + "/" + fileName;
WWW www = new WWW(src);
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log("www.error:" + www.error);
}
else
{
if (File.Exists(des))
{
File.Delete(des);
}
FileStream fsDes = File.Create(des);
fsDes.Write(www.bytes, 0, www.bytes.Length);
fsDes.Flush();
fsDes.Close();
}
www.Dispose();
}
这样就把StreamingAssets下的文件拷贝到persistentDataPath里面
3、断点续传下载
在更新大文件的时候。有可能中途中断了下载。但又不想让用户从新下载已经下载过的资源。则需要用到断点续传的功能,在Unity中有两种方式,一种是C#原生的HttpWebRequest功能。还有一种是Unity实现的UnityWebRequest功能。两者接口只有细微的差别。在这我们使用HttpWebRequest方式来下载。
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_strUrl); //创建一个HttpWebRequest 并传入资源的下载链接
if(File.Exists(m_tempFilePath)) //判断之前的临时文件是否存在。如果存在则读取之前的数 据。并把fileSteam 的指针设置到文件尾部
{
fileSteam = File.OpenWrite(m_tempFilePath);
m_currentLength = fileSteam.Length;
fileSteam.Seek(m_currentLength, SeekOrigin.Current);
Debug.Log("m_tempFilePath Exists " + m_currentLength);
}
m_fileLength = GetLength(m_strUrl); //获取这个文件的大小
request.AddRange((int)m_currentLength); //设置HttpWebRequest 的请求偏移量
Stream stream = request.GetResponse().GetResponseStream(); //获取流对象
byte[] buffer = new byte[1024];
int length = stream.Read(buffer, 0, buffer.Length); //从流对象里读取数据
while(length > 0)
{
if (IsStop)
break;
fileSteam.Write(buffer, 0, length);
m_currentLength += length;
length = stream.Read(buffer, 0, buffer.Length);
}
stream.Close();
stream.Dispose();
request.GetResponse().Close();
}
File.Move(m_tempFilePath, m_saveFilePath); //文件下载完成之后。把临时文件移动到要保存的文件
long GetLength(string url) //这个函数是获取文件长度
{
HttpWebRequest requet = HttpWebRequest.Create(url) as HttpWebRequest;
requet.Method = "HEAD";
HttpWebResponse response = requet.GetResponse() as HttpWebResponse;
return response.ContentLength;
}