Unity 协程深入解析与原理

先来直接放一段代码

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class CoroutineTest : MonoBehaviour
 6 {
 7 
 8     void Start()
 9     {
10         Debug.Log("Start Begin");
11 
12         CustomCoroutine = DelayPrint("Hi");
13 
14         Debug.Log("Start End");
15     }
16 
17     bool isStartCoroutine = true;
18     IEnumerator CustomCoroutine = null;
19     void Update()
20     {
21         Debug.Log(""+Time.frameCount+"Update 在执行");
22         if (isStartCoroutine)
23         {
24             if (CustomCoroutine.MoveNext())
25             {
26                 Debug.Log(CustomCoroutine.Current.ToString());
27             }
28         }
29         Debug.Log("" + Time.frameCount + "Update执行结束");
30     }
31 
32     public IEnumerator DelayPrint(string somevalue)
33     {
34         Debug.Log("DelayPrint Start");
35         yield return 0;
36         Debug.Log("DelayPrint Debug:" + somevalue);
37         Debug.Log("DelayPrint End");
38     }
39 
40 }
CoroutineTest

代码结果如下:

这样一看是不是跟我们平时在Unity使用的StartCoroutine基本上是一样的了?其实还是有不一样的地方,这因为在Unity内部对自己的协程管理作了特殊处理(猜测)。

在Unity内的协程位置顺序图如下:

而我们在上面写的自己的协程只会在Update里运行,因为我们在Update里写MoveNext(),若是想在其他地方运行我们的协程就写在其他地方就好~

所以说Unity协程的本质就是Unity内部的轮询机制和IEnumerator迭代保存上下文执行代码段。

而我们平时在协程方法yield return XXX只是把这时刻代码运行的控制权交回给主线程(类似操作系统中的挂起),其他协程或者其他线程(类似WWW类,这会真正开启另一个线程去执行,否则本质上都是单线程),,然后保存当前方法代码段的状态,等Unity内部的再次轮询回到被挂起时的代码状态继续执行,直到没有yield return的时候,这样就形成了一种代码分段执行的效果。

也当只有yield return XXX时IEnumerator.MoveNext()才会为true,然后IEnumerator.Current是yield return XXX的XXX。

所以在Unity里面的yield return WaitForSeconds返回给Unity中内部的协程状态机作判断处理,例如如果是返回WaitForSeconds类则给这个协程求时间差以达到延迟处理。

如果没有yield return,也就是没有返回值,这时IEnumerator.MoveNext()为false,这就会退出了Unity轮询。

大概就这样,要是更想理解细节的话可以百度IEnumerator和作用和把上面的代码逐步调试下即可。

参考:https://www.zhihu.com/question/34878524/answer/61555725

   https://www.zhihu.com/question/23895384/answer/26066323

     http://dsqiu.iteye.com/blog/2029701

     CoroutineManager插件源码(这个插件是在自己的Update方法里不断轮询CoroutineManager的协程集合内,获取每个协程的MoveNext()状态,从而进行一些简单的判断管理一个协程)

转载于:https://www.cnblogs.com/SeaSwallow/p/6561053.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NAT协议详解

NAT(Network Address Translation,网络地址转换)是将IP数据报头中的IP地址转换为另一个IP地址的过程。在实际应用中,NAT主要用于实现私有网络访问公共网络的功能。这种通过使用少量的公网IP地址代表较多的私网IP地址的方式&#x…

计算机应用基础文字处理软件应用职高PPT,《计算机应用基础》职高2010修订版_教(学)案...

《计算机应用基础》职高2010修订版_教(学)案 (93页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!39.9 积分. .《计算机应用基础》职高2010修订版 教案第一章 计算机基础知识第二章 中文…

快速排序【记录一下代码】

本文仅用作学习记录,大神勿喷O(∩_∩)O~ 代码一、百度百科C语言版本代码,参考数据结构p274(清华大学出版社,严蔚敏) 1 void Qsort1(int a[], int low, int high)//百度百科C语言版本代码 2 {/*参考数据结构p274(清华大学出版社,严蔚敏)*/3 …

eclipse 修改java代码不重启服务器 生效配置

1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改(不是增减方法、变量&…

Shell第二篇:正则表达式和文本处理工具

一 什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。 生活中处处都是正则: 比如我们描述:4条腿 你可能会想到的是四条腿…

计算机二级办公软件高级应用难不难,计算机二级office难吗 考试内容是什么

相信很多的在校大学生或者已经开始工作的小伙伴都会有考虑过要考国二MsOffice高级应用考试,那么,计算机二级office难吗?考试内容是什么?计算机二级office难吗许多考生基础差,考生缺乏备考计划,超过70%的考生…

sed 解释正则表达式

以/etc/passwd文件为模板 1,删除文件每行的第一个字符。 2,删除文件每行的第二个字符。 3,删除文件每行的最后一个字符。 4,删除文件每行的倒数第二个字符。 5,删除文件每行的第二个单词。 转载于:https://www.cnblogs…

在windows下codeblocks中配置pthread库

转自:http://blog.csdn.net/u013172314/article/details/50846198 如果添加方法不正确,可能会出现pthread_create’未定义的引用,所以下面我讲一下正确的配置方法。 首先介绍一下我的安装平台和需要下载的工具包: win7 64位&#…

[Android-Appium]: 安卓自动化测试: 环境准备

安卓自动化测试:环境的准备: 在做安卓自动化测试之前,需要在你的电脑上做如下环境的准备, 我用的是 Appium做的自动化测试。 安装Appium server, 安装路径:http://appium.io/ https://bitbucket.org/app…

计算机考研8,计算机考研每日一练:第八天

平衡二叉树实现原理平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中…

Python全栈开发:web框架们

Python的WEB框架 Bottle Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块。 1234pip install bottleeasy_install bottleapt-get install python-bottlewget htt…

软件测试实验二

1.百度搜索seleniumIDE,进入官网http://www.seleniumhq.org/download/下载区下载软件 2.使用seleniumIDE录制脚本,打开IDE,录制脚本,并测试脚本 3.导出脚本,完成实验 转载于:https://www.cnblogs.com/wyp-run/p/661974…

计算机在管理会计应用中的作用,信息化在管理会计中的作用

信息化在管理会计中的作用在管理会计的日常工作中,需要进行大量的数据收集整理工作,会出现漏算错算等情况,加强管理会计软件的创新和研发,从而推进企业会计电算化。摘要:较比以往,信息技术不断发展,在人们的…

基于鸢尾花数据集的逻辑回归分类实践

基于鸢尾花数据集的逻辑回归分类实践 重要知识点 逻辑回归 原理简介: Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别)&#xff0c…

校办研修之计算机培训简报,“2018校本研修培训”第二期学习简报

原标题:“2018校本研修培训”第二期学习简报校训校风:博教风学风:学习提升,共约成长洛阳市第二十六中学2018年校本研修培训学习简报(第二期)素材收集:数学组、物理组、生物组制 作:郭志伟、张志刚时 间&…

Python之路 day1 基础1 变量 for while 用户输入

一、 Python介绍 python的创始人为吉多范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 最新的TIOBE排行榜&#xff…

20155302 2016-2017-2 《Java程序设计》第六周学习总结

20155302 2016-2017-2 《Java程序设计》第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,Ou…

找不到tgp饥荒专用服务器,饥荒tgp版专用服务器搭建指南_游侠网

《饥荒》很多玩家购买了tgp版,对于服务器的搭建还不熟悉。下面小编带来《饥荒》tgp版专用服务器搭建指南,一起来看吧。1.创建以下文件夹\\(我的)文档\Klei\\DoNotStarveTogetherRail\MyDediServer\\(我的)文档\Klei\\DoNotStarveTogetherRail\MyDediServ…

elementui源码_Element UI 终于还是来啦

昨天, Element Plus for Vue 3.0 Beta 版本正式发布了!对,就是那个被外界传言不再维护的Element UI!Element Plus for Vue 3.0 是一个使用 TypeScript Composition API 重构的全新项目。官方团队几乎重写了每一行 代码&#xff0…

复地邮箱服务器地址,打印服务器设置方法

现在很多人会使用打印机,打印机可以帮助我们打印一些资料,但是很多人之前可能没有使用过打印机,因此自己购买了之后发现不会使用,不会设置,今天就为您介绍一下打印服务器安装设置,希望对您有帮助。打印服务…