理解协程

IEnumerator+yield 强大的迭代器

IEnumerator 就是一个函数容器 里面保存了一个一个的函数

IEnumator会依次执行每个函数  而每个函数都有一个返回值 保存在IEnumator.Currect里面

看下面这个例子

IEnuermator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";
}

yield就是从开始到yield之间的代码做成一个函数  实际上可以理解为yield就是如下

function (){Debug.Log("HellWord");return 1;
}
function (){Debug.Log("HellWord!!!");return "abc";
}

启动协程 this.StartCoroutine(e);

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IECoroutine : MonoBehaviour
{void Start(){IEnumerator e = this.start_Coroutine();this.StartCoroutine(e);}IEnumerator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";}
}

yield return null;11下一帧再执行后续代码
yield return 0;1/下一帧再执行后续代码
vield return 6:/1任意数字)下一帧再执行后续代码
vield break;1/直接结束该协程的后续操作
yield return asyncOperation://等异步操作结束后再执行后续代码
vield return StartCoroution(/*某个协程*八://等待某个协程执行完毕后再执行后续代码
yield return www0://等待www操作完成后再执行后续代码
vield return new WaitForEndOfFrame()://等待帧结束,等待直到所有的摄像机和GU被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForseconds(0.3f)://等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的
间会受到Time.timescale的影响)
vield return new WaitForSecondsRealtime(0.3f)://等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后
(这里的时间不受到Time.timescale的影响);
yield return WaitForFixedUpdate()://等待下一次Fixedupdate开始时再执行后续代码
vield return new WaitUntil0//将协同执行直到 当输入的参数(或者委托)为true的时候
yield return new Waitwhile0//将协同执行直到 当输入的参数(或者委托)为false的时候

模拟协程实现过程

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IECoroutine : MonoBehaviour
{IEnumerator ie = null;void Start(){ie = this.start_Coroutine();}IEnumerator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";}void LateUpdate(){if (this.ie != null){if (!this.ie.MoveNext()){this.ie = null;}else{Debug.Log("ie.Current = " + ie.Current);}}}
}

输出结果如下

IEnumerator.MoveNext:执行当前函数 并将返回值存储到IEnumerator.Current里面  并把函数索引拨动到下一个  如果执行到头了 没有可执行的函数了 IEnumerator.MoveNext就会返回false

模拟协程等待时间

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IECoroutine : MonoBehaviour
{IEnumerator ie = null;void Start(){ie = this.start_Coroutine();}IEnumerator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";Debug.Log("开始等待3秒");yield return new ClassWaitForTime(3);Debug.Log("等待3秒结束");}void LateUpdate(){if (this.ie != null){if (this.ie.Current is ClassWaitForTime){ClassWaitForTime cw = ie.Current as ClassWaitForTime;cw.Update(Time.deltaTime);if (!cw.IsOver()){//时间未到则停止往下继续执行return;}}if (!this.ie.MoveNext()){this.ie = null;}else{Debug.Log("ie.Current = " + ie.Current);}}}
}class ClassWaitForTime
{private float total;private float nowtime;public ClassWaitForTime(float time){this.total = time;this.nowtime = 0;}public void Update(float time){this.nowtime += time;}public bool IsOver(){return this.nowtime >= this.total;}
}

输出结果如下

Unity 协程、模拟协程相关推荐

  1. python用于pmc排产可以吗_PMC生产排程——模拟排程

    永凯PMC的使用界面功能,通过每天从ManBase MRP II系统获取客户的订单.永凯PMC安排整个冲压部的客户订单,分配相应的机器和模具加工客户订单.永凯PMC提供了可视性,管理按部门之间的相互关 ...

  2. Unity中迭代器和协程的部分概念

    协程本质上也是一个迭代器,为了记录一下今天对二者的学习和巩固记录一下今天的知识点. 首先了解一下迭代器的知识: 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露 ...

  3. Unity 之 关于停止协程的五种方式解析

    Unity 之 关于停止协程的五种方式解析 前言:了解协程 方式一:函数的方式 方式二:函数名的方式 方式三:接收返回值 方式四:StopAllCoroutines 方式五:禁用/销毁游戏对象 本文小 ...

  4. unity update 协程_Unity 协程的原理

    Unity 协程的原理 发布时间:2019-06-13 18:45, 浏览次数:1118 , 标签: Unity 协程不是多线程,协程还是在主线程里面(注:在Unity中非主线程是不可以访问Unity ...

  5. python协成_Python协程(上)

    几个概念: event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上.当满足事件发生的时候,调用相应的协程函数. coroutine 协程:协程对象,指一个使用asy ...

  6. 深入并发线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解

    一.进程.线程.纤程.协程.管程概念理解 在现在你可能会经常看到进程.线程.纤程.协程.管程.微线程.绿色线程....一大堆xx程的概念,其实这些本质上都是为了满足并行执行.异步执行而出现的一些概念. ...

  7. 进程、线程、协程和管程的区别

    大家都知道,计算机是为了模拟现实世界,其中计算机领域最伟大的发明之一就是操作系统.操作系统对于计算机来说是其核心的存在,可以说操作系统的地位就像计算机的灵魂一样.操作系统的诞生是为了运行用户程序,事实 ...

  8. Linux高性能网络:协程系列09-协程性能测试

    目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 ...

  9. Linux高性能网络:协程系列08-协程实现之调度器

    目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 ...

最新文章

  1. webstorm代码行数统计_10万行代码10万年薪,利用python查看自己写了多少代码
  2. 常见Python爬虫工具总结
  3. 使用DPAPI加密或解密你的数据
  4. (王道408考研操作系统)第一章计算机系统概述-第一节4:中断和异常
  5. 网盘大战-各网盘使用测试
  6. Linux输入子系统学习笔记
  7. HTML列表、表格、表单、超链接、音视频标签、内嵌
  8. 什么是P2P和它的应用
  9. BibTex中参考文献种类
  10. 修改element插件样式---select样式
  11. 《OpenGL ES 3.x游戏开发(下卷)》一2.3 风吹椰林场景的开发
  12. 计算机组装实验硬盘分区方法,硬盘怎么分区和格式化 史上最详细的硬盘分区方法大全 (全文)...
  13. UV/PV 的共同点和区别
  14. 查准率(Precision),灵敏性(Sensitivity),特异性(Specificity),F1,PR曲线,ROC,AUC
  15. Unity3d坦克大战联网
  16. 中国传统色的魅力|这8组中国风传统颜色你一定要收藏
  17. 如何用建木CI更新七牛云CDN证书
  18. python制作词典软件_Python爬虫之二:自制简易词典
  19. javaScript模拟实现call
  20. 栈和队列——构造数组的MaxTree(java实现)

热门文章

  1. Linux基础入门 - 查看日志
  2. python 给图像添加合成透明图片贴纸
  3. error C4996解决办法
  4. 学习python基础(五)
  5. DevExpress破解版下载
  6. Unity UGUI 滚动列表
  7. 下级对上级回复已阅知_常见公文批示用语
  8. AudVidder(音频视频转换器)v1.0.0.4版本更新
  9. java实现双重曝光功能_看起来很「高大上」的双重曝光,其实用手机就能轻松搞定...
  10. jsp实现respond页面的刷新与跳转功能