大家好,又见面了,我是你们的朋友全栈君。
协程使用之前请注意以下几点:
1.协程只需要调用一次,只需要调用一次,只需要调用一次 !
2.yield return表示挂起,挂起的意思是协程里的变量会被保留,直到达到return的条件才会执行return以下的代码片段。
举个例子:
yield return new WaitForSeconds(0.9f);//执行到这儿,等待0.9s,继续执行这句代码以下的代码片段
3.开启协程的方式:
a.StartCorountine("协程函数名");
b.StartCorountine(协程函数名(协程形参));//可以传多个参数
4.协程只需调用一次,但可以控制内部执行次数:
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渲染完成之后执行后面语句
}
}
5. 一个最近弄明白的坑(错了,具体请看下面仰望星空的评论)
目标:点击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()");
}
6.协程不是多线程:
协程是在主线程(Main Thread)执行的过程中开启的一段逻辑处理,和主线程共用一份资源,挂起的时候不会阻塞主线程,但要注意的是同一时刻只运行一个协程;多线程则不能共享主线程里的资源,需要关心同步以及锁的问题。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148616.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...