Sharafiq Sharif
Sharafiq Sharif

Reputation: 51

How to get download progress using UnityWebRequest to download Asset Bundle from server?

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

Answers (2)

Ketan
Ketan

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

derHugo
derHugo

Reputation: 90580

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.

Upvotes: 8

Related Questions