快速帮理解Unity中的协程Coroutine

协程的概念

Unity协程(Coroutine),可以用来实现一些延时处理的需求,C#中通过yield return语句配合可以中断执行,延时一定时间后从中断处继续执行。

协程不是线程,协程还是在主线程里执行的。所以就不需要考虑同步和锁的问题。

原理

Unity的协程是一个扩展成支持嵌套的迭代器(IEnumator)。
将c# IEnumerator封装为Coroutine对象,记录了该协程的上一级协程是谁,当这个协程执行完成,会继续执行上一级协程。

当Unity Coroutine调用IEnumerator的MoveNext返回一个新Coroutine时,Unity设置新对象的上级Coroutine为当前Coroutine,同时将新Coroutine压入队列,通过此实现嵌套。

然后Unity在主线程中定时检测当前每个等待的Coroutine,满足条件则执行。

用法

yield

JavaScript的Generator和yield

之前学过javascript的异步,里面也有yield关键字,都是暂停执行当前的函数,先去执行yield后面的语句(可以是一个函数),然后执行完毕会直接返回,如果有多个yield就需要手动调用next()进行迭代。在js里面就以这种方式实现Ajax异步操作的顺序执行,在Unity里面则是实现类似于子线程(注意只是类似!),它的执行也是顺序执行的。

yield语句用于暂停协程的执行(暂停一帧,跳出协程),yield return 的值决定什么时候恢复协程的执行。

yield语句的返回有如下类型:

yield return null;//下一帧再继续往下执行
yield return new WaitForFixedUpdate();//等到下一次调用FixedUpdate再往下执行
yield return new WaitForSceonds(n);//等待n秒再往下执行
yield return StartCoroutine(Method);//开启另一个协程,直到Method执行完毕再往下执行
yield return new WaitForEndOfFrame();//等到该帧结束再往下执行
yield return WWW;//等待资源加载完成再往下执行
yield break;//结束协程

函数

启动一个协程

StartCoroutine("tmp");
StartCoroutine("tmp","value");
StartCoroutine(tmp());
//推荐使用`StartCoroutine(tmp());
//因为传递方法名需要用到反射机制,影响性能。

终止协程。

StopAllCoroutines();//关闭所有协程注意,这只会终止在调用该方法的对象中
StopCoroutine("tmp");//注意开启协程传递字符,关闭也要传递字符
StopCoroutine(tmp());

//注意
this.enabled = false; //会停止update()运行,但是协程还在运行
this.gameObject.SetActive(false); //update和协程都会停止运行

实例

如果遇到一些执行顺序的问题,可以直接看官方文档函数执行顺序的流程图。
http://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg

	private void Start () 
	{
		//启动销毁计时器协程
		StartCoroutine(DestroyAfter ());
	}
	private IEnumerator DestroyAfter () 
	{
		//等待设定的时间后销毁对象
		yield return new WaitForSeconds (5);
		Destroy (gameObject);
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我了解了你的要求。关于Unity协程Coroutine的使用,我可以为你介绍一下。 CoroutineUnity的一种协作式线程实现方式,它可以在执行一段代码时主动断执行,等待特定条件而不阻塞主线程。在Unity协程通常用于异步操作、延迟执行、动画演示等场景。 Unity启动协程Coroutine的方法是使用StartCoroutine()函数,并传递一个IEnumerator类型的对象参数给它。IEnumerator作为协程的核心,它定义了一种迭代器的行为,可以通过yield语句来指定协程执行的流程。 比如,下面的代码是一个简单的协程实现: ``` IEnumerator ExampleCoroutine() { Debug.Log("start"); yield return new WaitForSeconds(1.0f); Debug.Log("wait 1s"); yield return new WaitForSeconds(2.0f); Debug.Log("wait 2s"); yield return null; Debug.Log("end"); } ``` 其,yield return new WaitForSeconds(1.0f)表示等待1秒后继续执行协程,yield return null表示协程结束。 启动该协程可以使用StartCoroutine(ExampleCoroutine())方法,这将在不阻塞主线程的情况下执行协程的逻辑。 对于多协程并行执行的情况,可以使用yield return StartCoroutine()的方式来实现,如下所示: ``` IEnumerator CoroutineA() { for (int i = 0; i < 10; i++) { Debug.Log("CoroutineA: " + i); yield return null; } } IEnumerator CoroutineB() { for (int i = 0; i < 5; i++) { Debug.Log("CoroutineB: " + i); yield return null; } } IEnumerator CoroutineC() { yield return StartCoroutine(CoroutineA()); yield return StartCoroutine(CoroutineB()); Debug.Log("CoroutineC end"); } ``` 在上面的示例CoroutineC使用了yield return StartCoroutine()的方式来启动多个协程,并且等待它们全部执行结束后再继续执行。这样可以实现多个协程并发执行,同时确保它们按照正确的顺序执行。 希望以上内容对你有助。如果有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪野Solye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值