Unity C#中协程/携程Coroutine简单易懂详解

目录

前言

一、预备知识

1.主程

2.案例

3.携程汇报

4.主程的工作时间

二、携程应用

1.简单携程

2.携程汇报

3.携程开启和停止

三、总结


前言

从粉丝私信来的新需求,希望能详细理解一下携程。因为我初学的时候对携程也是半天没弄懂,所以很开心给你们打伞。

一、预备知识

这里讲的是理解携程必须懂的知识点。

1.主程

主程:主要程序

如果拿小说来举例,就是主人公,整个小说都是围绕主人公进行的,就算有其他剧情,也只是支线,如果主人公不希望支线存在,也就不存在了。那么这个支线,就是携程。

2.案例

人就是一直用主程和携程生活的例子。

主程 = 大脑

携程 = 四肢

大脑会给四肢下达指令,他们可以去干不同的事情,但是因为他们共用一个大脑,所以如果我让你左手画圆,右手画方,左脚画五角星,右脚画三角,你会反应不过来,因为大脑不够用了。

主程和携程共用cpu,主程卡了,携程一定受影响(大脑崩了,你还想干嘛!)

携程出问题,主程一定程度受影响。(这就看四肢是扭了一下,还是直接骨折了)

携程是被主程安排和控制的。(事都是大脑分配的)

但携程自己做事时,不需要大脑时时刻刻控制。(谁在卫生间不刷个手机呢!也没看拉不出来啊)

主程可以控制携程对cpu的占用程度。(你可以选择专心致志、全力以赴拉屎,也可以选择漫不经心,细水长流,当然,如果你全力以赴拉屎,可能看手机看的就慢了,都是相对的

3.携程汇报

还记得小时候被老师控制的日子吗?

老师说,你写完语文作业就给我说一声。

老师说,你10分钟以后来找我。

老师说,你什么时候把这道题做对了,你才能回家!

怎么样,瑟瑟发抖了吧!!!!

所以携程必须要定时汇报,但是他肯定需要在老师上班时间汇报,不能半夜四点钟去老师家敲门:“嗨~我作业写完了,你要起来改作业吗?”会被打死!

4.主程的工作时间

主程的工作节奏就是帧率,理想情况下是0.02秒执行一次。就是update每次执行的时间。

很遗憾的是,我们计算机有时候会卡,或者配置不高,会比较慢,那么可能每次时间不一样,有的0.05秒,也可能这次0.04秒,下次0.01秒。有高有低的。

不管具体多少秒执行一次,执行一次就是一回合。

二、携程应用

努力看到这里的宝宝,恭喜你们哦!接下来你们理解起来会很轻松。

1.简单携程

这里随便写了一个携程,会有常见的报错。(如图1所示)

图1 新建携程

因为携程是支线!干事情必须要和主线汇报!

2.携程汇报

知道要汇报,我们就要讨论一下,什么时间汇报。

yield return null;     // 下一帧再执行后续代码
yield return 0;        //(0可以是任意数字) 下一帧再执行后续代码

还记得之前说的,我们是回合制的吗?理想情况下0.02秒执行一次的事情。

这里就好像,你周末作业有2篇作文,老师对你说,大家不要一次性写完,一天一篇哦!

    //作业:有两篇作文
    IEnumerator DoHomeWork()
    {
        Debug.Log("写完了一篇作文");

        //携程说:我写完一篇作文了
        //主程说:不管现在还剩多少时间,先休息一下,下一帧(下一回合)再继续写
        yield return null;

        //因为后面没有别的 yield return了
        //所以这里还有一层意思:后面写完就不用汇报了,玩去吧

        Debug.Log("又写完了一篇作文");
        //携程工作完了,自己休息去了
    }

这里可能你疑问,为什么不一次性写完?

因为携程和主程是一个cpu(携程一直专心致志拉屎,主程玩手机就会慢呀!控制一下) 

经过上面的例子,你再去看下面这些(常用)汇报内容:

//你等这回合先别干,其他人都干完了,再做你这个
//案例:这次考试,你等所有人都交完卷子了,你再交
//有这个的主要原因是,图画一般渲染的比较慢,有时候你需要等图片都显示完全了,再执行
yield return new WaitForEndOfFrame();//等待帧结束

//后面别干了,就到这吧
yield break; //直接结束该协程的后续操作

//等一秒再干
yield return new WaitForSeconds(1f);//等待1秒;

//你等另一个携程干完了,你再继续
yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码

//你等网络响应完了,你再干
yield return WWW();//等待WWW操作完成后再执行后续代码

//括号里的内容是true的时候再继续干
//案例:体育老师说,如果你们班主任让我上课,我再上
yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候

//括号里的内容是false的时候再继续干
//案例:女生对男朋友说什么时候你不抽烟了,再亲我!
yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候

还有别的汇报内容,大家可以去搜索,因为牵扯到其他的一些知识点,但意思就是这个意思。

3.携程开启和停止

携程写好了,在主程里去使用它,也可以强行停止。

//开始协程:
//方法一:直接写方法名
//优点:书写简单
//缺点:没法停止
StartCoroutine(MyCoroutine());

//方法二:声明一下再用
//优点:可以停止
//缺点:写起来麻烦
private Coroutine myCoroutine;
myCoroutine = StartCoroutine(MyCoroutine());

//方法二停止协程:
StopCoroutine(myCoroutine);

//方法三:用名字开始
//优点:可以停止
//缺点:写起来麻烦
StartCoroutine("MyCoroutine");    //开启方法名称为MyCoroutine的携程
//方法三停止协程:
StopCoroutine("MyCoroutine");

//通用
//停止当前对象上所有正在运行的协程
StopAllCoroutines();

三、总结

主程不能一个人干所有事情,而且主程不能等待,几乎一直在做事(玩游戏也不想死机硬等吧)

有时候也确实需要一些帮手,就和做饭一样,有时候你还是希望有两个锅吧。

这时候它需要别人帮帮他,所以他分配任务他控制执行速度把控重要的每一步,就和实习生的师傅,学生的家教一样。

至于大家想拿这个功能干嘛,就是仁者见仁智者见智了。

大家好,我是一个励志用简单语言讲解程序的up,欢迎大家私信需求!~~

感谢大家关注、点赞、收藏~~(づ ̄3 ̄)づ╭❤~

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菌菌巧乐兹

希望能给大家写更多有用的文章~

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

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

打赏作者

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

抵扣说明:

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

余额充值