一、协程的定义
协同程序,即在主程序运行的同时开启另一段协同的程序
二、协程的特点
① gameObject.SetActive(false)
可以终止让该物体上已开始运行的所有协程(协程绑定给游戏对象,游戏对象不存在,则协程亦消失);
② gameObject.GetComponent<DemoScript>().enabled = false
无法终止该物体上已开始运行的协程(此设置虽然可以停止绑定在该物体上脚本的Update等一系列MonoBehaviour方法,但是协程区别于主程序,只和该游戏对象相关)
三、协程的使用
StartCoroutine //开启协程
StopCoroutine //停止协程
StopAllCoroutines //停止所有协程
协程方法的定义(只以C#为例,必须使用C#的IEnumerator接口)
IEnumerator CoroutineFunc()
{
Debug.Log("协程" + Time.time);
yield return null;
}
StartCoroutine(CoroutineFunc()); //只有等待协程执行完毕或执行StopAllCoroutines();才可以停止协程执行
StartCoroutine("CoroutineFunc"); //可以等待协程执行完毕或执行StopAllCoroutines();或执行StopCoroutine("CoroutineFunc")停止协程执行
(据有关文章介绍,StartCoroutine(CoroutineFunc())比StartCoroutine("CoroutineFunc")开启协程的效率稍微高点,追求高效的朋友,可以适当的选择其一)
四、协程中,常用的yield介绍
① yield return 0
或 yield return null
//表示在协程方法中,yield后面的语句,会在下一帧执行(不懂后面实例会详解)
② yield WaitForSeconds(2);
//表示在协程方法中,yield后面的语句,会在2秒后执行(同上)
③ yield WaitForFixedUpdate();
④ yield WWW;
//表示在协程方法中,yield后面的语句,会在www请求后执行
⑤ yield StartCoroutine(MyFunc);
//执行另一个协程
五、协程的实例
① 首先做一个例子,证明协程不影响主程序正常运行
using UnityEngine;
using System.Collections;
public class DemoScript : MonoBehaviour {
// Use this for initialization
void Start () {
Debug.Log("Start"+ Time.time); //语句1
StartCoroutine("WaitPrint"); //语句2
Debug.Log("End" + Time.time); //语句3
}
IEnumerator WaitPrint()
{
yield return new WaitForSeconds(1f); //表示1S后执行后面Debug.Log命令
Debug.Log("协程" + Time.time);
}
}
运行结果:
由运行结果可知,Start方法中,
我们是先执行语句1
然后开启协程,执行语句2
最后执行语句3
但是语句3并没有等待协程执行完毕后再输出,而是直接输出了,所以协程不影响主程序正常运行。
② 协程的应用实例
举例我们在执行某个程序的情况下,需要下载网上的某个资源,但是又不能影响主程序的执行,那么您会不会想到开启一个线程去执行下载网上资源的方法呢,此时协程就可以帮我们解决这个问题,下面我们来码
using UnityEngine;
using System.Collections;
public class DemoScript : MonoBehaviour {
// Use this for initialization
void Start () {
Debug.Log("Start"+ Time.time); //输出时间
StartCoroutine(LoadTexture("http://d.hiphotos.baidu.com/zhidao/pic/item/962bd40735fae6cd0009f9410eb30f2442a70f54.jpg"));
Debug.Log("End" + Time.time); //输出时间
}
IEnumerator LoadTexture(string url)
{
//这里的url可以是web路径也可以是本地路径file://
WWW www = new WWW(url);
//挂起程序段,等资源下载完成后,继续执行下去
yield return www;
PrintDownloadPic(www); //执行打印方法
}
public void PrintDownloadPic(WWW www)
{
Debug.Log(www.isDone); //打印图片是否下载完成
}
}
运行结果
这里就完成了异步操作