Unity的资源更新----个人学习记录

版本: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;

}

猜你喜欢

转载自blog.csdn.net/Edision_li/article/details/81354085