U3D协程Coroutine之WWW与Update()的并行测试

using System.Collections;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

/************************************************************************/
/* UnityEngine.WWW 下载与Update()的并行测试,UNITY5.35f                  */
/************************************************************************/
public class wwwTest : MonoBehaviour {

    WWW www;
    IEnumerator Start () {


        //下载文件是一个RAR,比较大,要下载几分钟才能完成,
        //运行发现,下载和Update()并行,游戏正常运行,调试发现创建并使用WWW对象并不会开启新线程
        //这说明WWW也是利用协程来实现下载的,如果是这样,下载速度应该会受Update()函数调用频率的影响,经测试发现下载速度并不受影响,不明觉厉
        //【补记】在协程函数中使用Thread.sleep(1000)将会卡住主线程,不要在下载时这样用,这样只是在为其它进程节省时间,降低下载速度。
     www = new WWW ("http://psoft.33lc.com:801/small/directxruntimes_x86.rar"); yield return www;//下载开始,直到下载完成才会执行本函数剩余的代码。      
// Load the object asynchronously
     AssetBundleRequest request = bundle.LoadAssetAsync ("myObject", typeof(GameObject));
     // Wait for completion
     yield return request;//加载完成后才会执行后面的代码
if(www == null){ EditorUtility.DisplayDialog ("", "download stoped", "ok"); yield break;//协程将抛弃后面所有代码 //yield return null; //协程返回后下次回来会执行下面的代码,由于下载失败,下面的操作将出错 } if(www.isDone){ string info = "download complete"; if (!string.IsNullOrEmpty (www.error))//有些平台上不允许string为null,则这时返回空串""; //yield return null; //协程返回后下次回来会执行下面的代码,由于下载失败,下面的操作将出错 yield break; EditorUtility.DisplayDialog ("info", info, "ok"); } else{ EditorUtility.DisplayDialog ("error", "download error", "ok"); yield return null; } EditorUtility.DisplayDialog ("finally", "end", "ok"); RawImage img = GetComponent<RawImage> (); img.texture = www.texture; } void Update () { if(Input.GetKeyDown (KeyCode.Space)){ Debug.Log ("is done: " + www.progress); //显示下载进度 } else if(Input.GetKeyDown (KeyCode.LeftControl)){ if(Input.GetKey (KeyCode.W)){//组合键测试 CTRL + W // 诡异现象,注意:先按CTRL再W无法进入到这里,先W再CTRL则可以进入到这里。 //GetKeyDown在按键期间只触发一次,且不能再触发其它按键;GetKey在按键期间一直不断触发,且可以同时再触发其它键 //因此两个GetKeyDown(A)&&GetKeyDown(B)不能实现组合键。 //GetKey(A) && GetKey(B)可以实现组合键,对游戏效率影响较大 //GetKeyDown(A) && GetKey(B)也可以实现组合键,对游戏效率影响较小 //相机漫游类的操作需要按键每帧或每几帧触发,因此必须使用getkey if(EditorUtility.DisplayDialog ("", "你确定要终止下载吗", "ok", "cancel")){ www.Dispose (); www = null; } } } if(Input.GetKey (KeyCode.A) && Input.GetKey(KeyCode.B)){ Debug.Log ("A AND B ==============="); } transform.Rotate (0, 2, 0); } }
原文地址:https://www.cnblogs.com/timeObjserver/p/5985891.html