赞
踩
协程使用之前请注意以下几点:
举个例子:
yield return new WaitForSeconds(0.9f);//执行到这儿,等待0.9s,继续执行这句代码以下的代码片段
a.StartCorountine("协程函数名");
b.StartCorountine(协程函数名(协程形参));//可以传多个参数
a.一次:不需要判断语句
举个例子:
IEnumerator OnlyOnce()//i++和++i的差别请自行百度
{
int i = 0;
yield return i++;//i加1以后执行Debug语句
Debug.Log("i = {0}" + i);
}
void Start()
{
StartCorountine("OnlyOnce");//控制台输出:i = 1
}
b.有限次:需要判断语句
举个例子:
IEnumerator FiniteTimes()
{
int i = 0;
while(i < 9)
{
i++;
//只需要执行协程,无条件挂起,可以用yield return null 或者 yield return 0
yield return i;
}
Debug.Log("i = " + i);
}
void Start()
{
StartCorountine(FiniteTimes());//输出: i = 9
}
c.无限次,类似Update或者FixedUpdate函数:永真式->while(true)
举个例子:
IEnumerator AllTheWay() { int i = 0; while(true) { yield return ++i; if(i > 9) { yield break;//yield break为结束循环的语句,表示协程内的循环执行到这儿结束,类似一般循环中的break } Debug.Log("i = " + i);//会输出1-9 //可以多个yield return语句同时使用 yield return new WaitForSeconds(0.9f);//等待0.9秒,执行下面代码块 yield return new WaitForEndOfFrame();//等待所有GameObject渲染完成之后执行后面语句 } }
目标:点击UGUI的button,立即输出“CallFunc()”
//将CallFunc挂到UGUI的button上,点击button,然后..........
//然后等2.9s后才会输出“CallFunc()”
public void CallFunc()
{
Debug.Log("CallFunc()");
StartCoroutine(Func());
}
IEnumerator Func()
{
yield return new WaitForSeconds(2.9f);
Debug.Log("Func()");
}
解决方法: 协程前面加一行代码(a)yield return 0;(b)yield return null;
IEnumerator Func()
{
//yield return null;
yield return 0;
yield return new WaitForSeconds(2.9f);
Debug.Log("Func()");
}
协程是在主线程(Main Thread)执行的过程中开启的一段逻辑处理,和主线程共用一份资源,挂起的时候不会阻塞主线程,但要注意的是同一时刻只运行一个协程;多线程则不能共享主线程里的资源,需要关心同步以及锁的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。