private IEnumerator DownloadCore() { yield return 0; float progress = 0f; float freezeTime = 0f;//用来记录进度没有变化的时长 WWW www = new WWW(Url); while (true) { yield return 1;// 每一帧进行判定,这样可以合理的判定时间 if (www.isDone) { if (www.HasError()) SetError(www.error); else if (www.size == 0) SetError("Url不存在"); else SetSucess(www.bytes); break; } else { if (progress == www.progress) { if (progress != 1f) { freezeTime += Time.deltaTime; if (freezeTime > TIMEOUT_TIME) { SetTimeout(); break; } } } else { freezeTime = 0f; progress = www.progress; if (OnProgress != null) OnProgress(www.bytesDownloaded); } } } www = null; }
/// <summary> /// 执行并等待结果 /// </summary> IEnumerator ExecuteAndWaitResponse() { yield return 0; float progress = 0f; float freezeTime = 0f;//用来记录进度没有变化的时长 mWWW = new WWW(mUrl, mPostData, mHeaders); while (true) { yield return 1;// 每一帧进行判定,这样可以合理的判定时间 if (mWWW.isDone) { // 出错 || mWWW.bytes.Length != mWWW.bytesDownloaded if (mWWW.HasError()) Notify(NetState.Error); // 成功 else Notify(NetState.Succeed); break; } else { if (progress == mWWW.progress) { // 即使WWW.progrss =1后还有一小段时间用于内部处理AssetBundle才会isDone=true,所以不用计入超时 if (progress != 1f) { freezeTime += Time.deltaTime;//由于是获取Time.deltaTime,所以必须要yield return 1; if (freezeTime > mTimeoutTime) { Notify(NetState.Timeout); // 由于是超时,所以需要进行中断处理 // mWWW.Dispose(); break; } } } else { freezeTime = 0f; progress = mWWW.progress; // 汇报进度变化 Notify(NetState.Progress); } } } // WWW结束 mWWW = null; mUrl = null; mPostData = null; mHeaders = null; mTag = null; mHandler = null; }