5

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.

Sharafiq Sharif
  • 51
  • 1
  • 1
  • 2

2 Answers2

8

Instead of

yield return StartCoroutine(DownloadProgress(operation));

the proper way of yielding 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.

derHugo
  • 83,094
  • 9
  • 75
  • 115
  • I tried above way, But still not able to get percentage in my android device(downloadProgress is always return 0), However in my windows editor above code is working fine. If there is any otherway then please guide me – Mayur Asodariya Sep 04 '20 at 08:26
  • I found that the issues was from server side and now I able to get float number by downloadprogress. For more info [link](https://stackoverflow.com/questions/23517940/size-not-showing-while-downloading-files-from-my-website) – Mayur Asodariya Sep 04 '20 at 08:51
  • @MayurAsodariya thanks for this input! Added it to the answer – derHugo Sep 04 '20 at 08:56
  • "an int division /100 = 0" because "something / int = int" – Arcueid D'athemon Sep 26 '21 at 15:46
0

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;
    }
Ketan
  • 1
  • 1