Unity(协程)

本文介绍了Unity中的协程,包括协程的定义、特点、使用方式和常见yield用法。通过实例展示了如何在不阻塞主程序的情况下进行异步操作,如延迟执行和网络请求,从而实现程序的高效运行。

一、协程的定义
协同程序,即在主程序运行的同时开启另一段协同的程序

二、协程的特点
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 0yield 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);    //打印图片是否下载完成
    }
}

运行结果代码运行结果
这里就完成了异步操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值