如何使用UnityWebRequest从服务器下载Asset Bundle获得下载进度?

时间:2019-05-23 08:13:33

标签: c# unity3d unitywebrequest

我还是新手,使用UnityWebRequest从服务器容器下载并加载资产捆绑包。问题是下载进度的值始终为0。 如何获得下载进度的价值?

代码下面是我尝试下载的文件,并获得下载进度。

//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");
}

我希望显示下载进度条或下载百分比以在屏幕上显示下载进度。但是下载进度值始终为0。

1 个答案:

答案 0 :(得分:0)

代替

yield return StartCoroutine(DownloadProgress(operation));

yield添加IEnumerator的正确方法很简单

yield return DownloadProgress(operation);

但是为什么不直接在同一个协程中直接做呢?

但是,我建议您宁愿使用UnityWebRequestAssetBundle.GetAssetBundle而不是从头开始配置它和进行一些其他更改:

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);
    }
}