C#之Coroutine

发表于2017-09-29
评论0 7k浏览

基本原理:

           利用c#yied特性,利用迭代器,在每一帧tick

           Unity的协程系统是基于C#的一个简单而强大的接口 IEnumerator,它允许你为自己的集合类型编写枚举器。

一些概念:

协程Coroutine并不是多线程的,只是运转的结果很像多线程而已。

他们最大的区别就是多线程可以多核并发,但是协程只能是单核按帧顺序轮转。

线程可以使用多个CPU,协程不能,所以线程是真的并行。
协程的有点是你可以自己调节你的CPU使用,优化也很方便。
单核机协程比线程块,多核机线程比协程块,U3D已经提供了很完善的协程模块,如果你的功能有图形化相关的操作就用协程好了,如果没有就用线程,毕竟现在的CPU很少有单核的。

协程是在unity主线程中运行的,每一帧中处理一次,而并不与主线程并行。这就意味着在协程之间并不存在着所谓线程间的同步和互斥问题,访问同一个值也都是安全的,不会出现死锁。一般来说,用协程可以处理绝大多数的问题,而且不用考虑复杂的线程间同步,还是很方便的。

 

简单例子:

了解完概念后,还是通过例子来感受协程的特点吧!

1.三秒后输出一条消息

如果用update去做的话

那么我们还要去维护计时器变量countTimer,重新计时还需要重置。协程的好处点感受到没?

2.每帧输出一条消息

这里while循环中使用yield得到一个无限循环协程,几乎等同一个update()。普通方法我们不可用无限循环!

3.一个计时器

 

方法状态被存储了,这也是协程的特点。即使在不同帧了,方法里定义的变量都会保存它们的值。

 

协程开始和终止

上面几个例子中都有通过 StartCoroutine()方法来开始一个协程。怎么终止?

如果我们想要终止所有的协程,可以通过StopAllCoroutines()方法来实现,它的所要做的就跟它的名字所表达的一样。注意,这只会终止在调用该方法的对象中(应该是指调用这个方法的类吧)开始的协程,对于其他的MonoBehavior类中运行的协程不起作用。

怎么终止其中的某个协程?

一种方法就是通过传方法名的字符串

还有一种终止方法

StopCoroutine(coroutine);//否则销毁 

 

unity中协程调用位置

整个生命周期非常清晰的一张图,赞!

 

 

动动手

实现在unity场景点击鼠标,不断掉落立方体的效果,如下:

具体代码:

这个可以挂在场景上的空gameobject上。

这个要挂在立方体上,掉出之后销毁物体。

 

参考:

https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

https://docs.unity3d.com/Manual/Coroutines.html

http://blog.csdn.net/dk_0520/article/details/53859871

http://blog.csdn.net/u010544244/article/details/74999944

 

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: