Reputation: 51
I still new using UnityWebRequest to download and load asset bundle from server container. The problem is the value for the download progress always 0. How can I get the value for download progress?
Code Below what I try to download and get the download progress.
//Method to download the assetbundle
IEnumerator DownloadAsset()
{
string url = here the URL for asset bundle;
using (var uwr = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET))
{
uwr.downloadHandler = new DownloadHandlerAssetBundle(url, 36, 0);
UnityWebRequestAsyncOperation operation = uwr.SendWebRequest();
yield return StartCoroutine(DownloadProgress(operation));
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(uwr);
{
print("Get asset from bundle...");
}
//Load scene
uwr.Dispose();
print("ready to Load scene from asset...");
StartCoroutine(LoadSceneProgress("Example"));
bundle.Unload(false);
}
}
//Method for download progress
IEnumerator DownloadProgress(UnityWebRequestAsyncOperation operation)
{
while (!operation.isDone)
{
progressBar.color = Color.red;
downloadDataProgress = operation.progress * 100;
progressBar.fillAmount = downloadDataProgress / 100;
print("Download: " + downloadDataProgress);
yield return null;
}
Debug.Log("Done");
}
I expect to display download progress bar or download percentage to show the download progress on screen. but the download progress value always 0.
Upvotes: 5
Views: 16136
Reputation: 1
Use following code snippet as a refference:
public IEnumerator ShowDownloadProgress(UnityWebRequest www)
{
while (!www.isDone)
{
LoadingContainer.SetActive(true);
SliderHandle.sprite = Resources.Load<Sprite>("LoadingScreenIcons");
loadingSlider.value = www.downloadProgress*100;
Debug.Log("Download Progress: " +www.downloadProgress);
NewDownloadProgressText.text = (string.Format("{0:0%}", www.downloadProgress));
yield return new WaitForSeconds(.01f);
}
loadingSlider.value = 0;
}
Upvotes: 0
Reputation: 90580
Instead of
yield return StartCoroutine(DownloadProgress(operation));
the proper way of yield
ing an IEnumerator
is simply
yield return DownloadProgress(operation);
However why not simply do it directly in the same Coroutine?
I would however recommend to rather use UnityWebRequestAssetBundle.GetAssetBundle
instead of configurating it from scratch yourself and some other changes:
IEnumerator DownloadAsset()
{
string url = "<here the URL for asset bundle>";
/*
* directly use UnityWebRequestAssetBundle.GetAssetBundle
* instead of "manually" configure and attach the download handler etc
*/
using (var uwr = new UnityWebRequestAssetBundle.GetAssetBundle(url, 36, 0)
{
var operation = uwr.SendWebRequest();
/*
* this should be done only once actually
*/
progressBar.color = Color.red;
while (!operation.isDone)
{
/*
* as BugFinder metnioned in the comments
* what you want to track is uwr.downloadProgress
*/
downloadDataProgress = uwr.downloadProgress * 100;
/*
* use a float division here
* I don't know what type downloadDataProgress is
* but if it is an int than you will always get
* an int division <somethingSmallerThan100>/100 = 0
*/
progressBar.fillAmount = downloadDataProgress / 100.0f;
print("Download: " + downloadDataProgress);
yield return null;
}
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(uwr);
{
print("Get asset from bundle...");
}
/*
* You do not have to Dispose uwr since the using block does this automatically
*/
//uwr.Dispose();
//Load scene
print("ready to Load scene from asset...");
StartCoroutine(LoadSceneProgress("Example"));
bundle.Unload(false);
}
}
Note from Mayur Asodariya fromt he comments below:
It might happen that your server does not provide the download size and therefore no progress information. In this case you can follow this post to configure your server correctly.
Upvotes: 8