{蜘蛛链轮}
当前位置: » 正文

关于Unity3D 协程实现方式的猜测

放大字体  缩小字体 发布日期:2018-11-07 09:51:23  

最近给公司新人培训,期间有人问到unity协程是什么原理,看网上各种帖子抄来抄去也并没有讲得很透彻,所以我决定自己实现一下unity的协程功能,顺便为公司下次培训积累点素材。

本篇文章慢慢干货,听我慢慢道来。

一、System.Collections.IEnumerator + yield

首先说明,该接口不属于unity。而Unity使用了这个接口和yield特性。那么这个组合具有什么样的特性呢,我们写个小程序来观察一下。

功能很简单,按空格键调用一次MyEnumerator中的MoveNext方法。

第一次按空格键log:

第二次按空格键log:

第三次按空格键log:

这实际上是编译器的语法糖,通过yield把GetMyEnumerator分割成了三个函数(暂且这么理解,应该不是很准确,具体应该查查),每次调用MoveNext时,就会执行下一个Yield之前的内容(包括当前Yield里的内容),该处需要划重点。

二、逻辑分析

想想在unity中如何使用协程:定义一个返回值为IEnumerator类型的函数Func,Func中可以yield return new waitforseconds,然后调用monobehavior中的startcoroutine方法转入Func()的返回值。那么我们就可以猜测,waitforseconds类中携带了断点信息(姑且这么叫吧,意会一下),在monobehavior中有底层的方法进行计时和判断是不是要调用IEnumerator中的MoveNext

借此,我们就可以实现自己的StartCoroutine,如图所示:

至此,一个非常简陋的协程原型就算写好了,通过调用StartMyCoroutine(MyCoroutine())就可以运行我们的demo了。

至此结束,有不明白的可以留言

{蜘蛛链轮}

 
 
[ 软文搜索 ]  [ 加入收藏 ]  [ 告诉好友 ]  [ 打印本文 ]  [ 关闭窗口 ]

 
 
 
    行业协会  备案信息  可信网站