Unity中WWW.bytesDownloaded加载时不更新,文本始终显示0的修复方法
嘿,这个问题我太熟了!你当前的代码只在创建WWW对象的瞬间读取了一次bytesDownloaded,然后就直接挂起协程等整个下载完成——这就难怪文本一直显示0,完全没实时更新啦!
问题根源
WWW对象刚初始化时,下载还没真正开始或者字节数统计还没更新,你只在这时候设置了一次文本,之后就没有任何后续更新操作,自然会一直停留在初始的0值。
修复后的WWW版本代码
我们需要在下载过程中持续循环更新UI,直到下载完成:
private IEnumerator DownloadFile(){ WWW w = new WWW(PATH_TO_DOWNLOAD); // 下载未完成时,每一帧更新一次UI while (!w.isDone) { // 实时刷新已下载字节数到文本控件 bytesDownloadedText.text = w.bytesDownloaded.ToString(); // 让协程暂停到下一帧,保证UI能正常渲染更新 yield return null; } // 下载完成后处理结果 if (w.error != null) { Debug.LogError("Error: " + w.error); } else { scriptText = w.text; filesDownloaded = true; Debug.Log(scriptText); // 最后再更新一次,确保显示最终的总下载字节数 bytesDownloadedText.text = w.bytesDownloaded.ToString(); } }
额外建议:改用Unity官方推荐的新API
WWW已经被Unity标记为过时API(Unity 2017.1+),更推荐使用UnityWebRequest,它性能更优且功能更完善,下面是对应的实现版本:
using UnityEngine.Networking; private IEnumerator DownloadFile(){ using (UnityWebRequest www = UnityWebRequest.Get(PATH_TO_DOWNLOAD)) { // 启动请求 var operation = www.SendWebRequest(); // 下载过程中实时更新UI while (!operation.isDone) { long downloadedBytes = www.downloadedBytes; bytesDownloadedText.text = downloadedBytes.ToString(); yield return null; } // 处理下载结果 if (www.result != UnityWebRequest.Result.Success) { Debug.LogError("Error: " + www.error); } else { scriptText = www.downloadHandler.text; filesDownloaded = true; Debug.Log(scriptText); bytesDownloadedText.text = www.downloadedBytes.ToString(); } } }
内容的提问来源于stack exchange,提问作者FlamingGenius
相关产品推荐
相关产品推荐

