unity3D之协程Coroutine

第二次写博客,对于unity3D的学习已经持续了近两个月,最近被其中的协程困惑很久,研究下简单写个记录供大家参考,欢迎各位大神指正错误。


一个最简单的实现协程的代码:

using UnityEngine;
using System.Collections;

public class coroutine : MonoBehaviour {

	// Use this for initialization
	void Start () {
        StartCoroutine(beginCoroutine());
	}

    public IEnumerator beginCoroutine()
    {
        yield return new WaitForSeconds(1.0f);
    }

	// Update is called once per frame
	void Update () {
	
	}
}
StartCoroutine():开启一个协程,可以是函数或者函数名称字符串,这里主要和结束协程StopCoroutine()有关。具体用法参照:点击打开链接
返回参数必须是IEnumerator,用yield return得到返回值。这里留个坑,IEnumerator和IEnumerable两个接口和yield用法暂时没搞清楚,过两天补上。
那么,这里主要介绍协程的使用注意,对于协程来说,小弟经过多次测试的验证发现结论就是一定要慎重使用协程!

第一,协程不同于线程,协程不是异步执行的,也就是说协程是作为一种函数在主函数中被调用的。

第二,C#中WaitForSeconds()函数不能直接使用,只能通过调用协程使用。也就是要实现过几秒执行的效果会用到协程。(Invoke()也留个坑)。

第三,yield的用法就相当于说:返回调用的函数,然后下一帧从这里重新开始。

具体给出一段测试函数。

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

    public static int count=0;
	// Use this for initialization
	void Start () {
        int i = 0;
        Debug.Log("start主函数");
        StartCoroutine(begin(i));	//第十行
        i++;
        Debug.Log("end 主函数" + i+","+count);
        Debug.Log("2222end 主函数" + i + "," + count);

	}

    public IEnumerator begin(int i)
    {

        Debug.Log("start 协成");
        count++;
        i++;
        Debug.Log("end 协成" + i + ", " + count);
        yield return new WaitForSeconds(3f);
        Debug.Log("return 协成完毕" + i + ", " + count);
        Debug.Log("2222end 协成" + i + ", " + count);

        

    } 
	// Update is called once per frame
	void Update () {
        
	}
}
在第十行调入协程后,会一直执行协程函数内的语句,直到遇见return。注意:此时执行WaitForSecond()函数,然后在当前帧继续执行调用协程的函数,也就是Start()内的代码,直到结束。下一帧回到协程函数内部,执行yeild return后面代码,直到函数结束。总之对于协程的使用一定要小心,如果只想实现延迟几秒,那么最好在Start()内调用协程之后不要有继续执行代码,或者控制好协程的stop。

代码执行结果:

unity3D之协程Coroutine_第1张图片

相关知识链接:点击打开链接


你可能感兴趣的:(unity3D之协程Coroutine)