第二次写博客,对于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。
代码执行结果:
相关知识链接:点击打开链接