问题:
我想在完成下载文件之前获取assetBundle的大小。我可以向用户显示剩余时间。在Unity2018.2中,能否获得让我乘以进度的文件大小或下载的文件大小?还是有其他方法可以计算剩余时间?
我知道 WWW.responseHeaders 包含该信息,但似乎需要完成下载。
这是我当前的代码。
using (WWW downloadPackageWWW = new WWW(pkg.url))
{
while (!downloadPackageWWW.isDone)
{
print("progress: " + downloadPackageWWW.progress * 100 + "%");
yield return null;
}
if (downloadPackageWWW.error != null)
print("WWW download had an error:" + downloadPackageWWW.error);
if (downloadPackageWWW.responseHeaders.Count > 0)
print(pkg.fileName + ": " + downloadPackageWWW.responseHeaders["Content-Length"]+" byte");
byte[] bytes = downloadPackageWWW.bytes;
File.WriteAllBytes(pkgPath, bytes);
}
-
更新:
要获取剩余时间,我提出了一个理想的方法,该方法可以通过 Time.deltaTime 进行计算,而我们不需要知道文件的总大小和下载速度。
float lastProgress = 0;
while (!www.isDone)
{
float deltaProgress = www.progress - lastProgress;
float progressPerSec = deltaProgress / Time.deltaTime;
float remaingTime = (1 - www.progress) / progressPerSec;
print("Remaining: " + remaingTime + " sec");
lastProgress = www.progress;
yield return null;
}
答案 0 :(得分:1)
您应该使用Unity的UnityWebRequest
API发出请求。在您当前的Unity版本中,WWW
API现在已在UnityWebRequest
的幕后实现,但仍然缺少许多功能。
您可以通过两种方式获得文件的大小,而无需下载或等待文件完成下载:
1 。通过HEAD
发出UnityWebRequest.Head
请求。然后,您可以使用UnityWebRequest.GetResponseHeader("Content-Length")
来获取数据的大小。
IEnumerator GetFileSize(string url, Action<long> resut)
{
UnityWebRequest uwr = UnityWebRequest.Head(url);
yield return uwr.SendWebRequest();
string size = uwr.GetResponseHeader("Content-Length");
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log("Error While Getting Length: " + uwr.error);
if (resut != null)
resut(-1);
}
else
{
if (resut != null)
resut(Convert.ToInt64(size));
}
}
用法:
void Start()
{
string url = "http://ipv4.download.thinkbroadband.com/5MB.zip";
StartCoroutine(GetFileSize(url,
(size) =>
{
Debug.Log("File Size: " + size);
}));
}
2 。另一种选择是将UnityWebRequest
与DownloadHandlerScript
一起使用,然后覆盖void ReceiveContentLength(int contentLength)
函数。调用SendWebRequest
函数后,ReceiveContentLength
函数应在contentLength
参数中为您提供下载大小。然后,您应该中止UnityWebRequest
请求。 Here是如何使用DownloadHandlerScript
的一个示例。
我会选择第一个解决方案,因为它更简单,更容易并且需要更少的资源来工作。