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,一经查实,立即删除!

相关文章

计算机操作员初级 第1单元0202微型计算机基本操作 教学大纲,计算机操作员教学大纲...

计算机操作员培训教学大纲一、课程的地位、目的与任务计算机应用基础课程是计算机操作员必修课。通过学习,测试学员的计算机基础知识,基本操作和使用计算机的能力;它是学员学习计算机的入门课程,提高学员的综合学习的能力。二、教…

晓庄学院计算机科学分数,南京晓庄学院计算机单招分数

技校网专门为您推荐的类似问题答案问题1:南京晓庄学院的计算机专业晓庄排名太低计算机实力也弱 你的分这么高 上了浪费 建议上南京林业大学或其它符合等级的外省一流学校问题2:有南京晓庄学院 行知学院 计算机专业的学生吗, 这个学校如何你好啊&#xff…

NAT协议详解

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

[Design-Pattern]工厂模式

Java版本 1 package interfaces;2 3 interface Service {4 void method1();5 void method2();6 } 7 8 interface ServiceFactory { 9 Service getService(); 10 } 11 12 class Implementation1 implements Service { 13 Implementation1() {} 14 public void method1…

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

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

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

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

计算机图学测试题及答案,《计算机图形学》练习测试题及参考答案

A 29、下列有关平面几何投影的叙述语句中,正确的论述为( ) A) 在平面几何投影中,若投影中心移到距离投影面无穷远处,则成为平行投影; B) 透视投影与平行投影相比,视觉效果更有真实感,而且能真实地反映物体的…

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

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

多媒体微型计算机必不可少的硬件,第1章计算机基础知识习题材料.doc

第三部分 习 题第1章1计算机基础知识一、单项选择题1.通常人们普遍使用的电子计算机是( )。A.数字电子计算机B.模拟电子计算机C.数字模拟混合电子计算机D.以上都不对2.世界上第一台电子计算机研制成功的时间…

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

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

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

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

vue.js指令v-model实现方法

原文链接&#xff1a;http://www.jb51.net/article/99097.htm V-MODEL 是VUE 的一个指令&#xff0c;在input 控件上使用时&#xff0c;可以实现双向绑定。 通过看文档&#xff0c;发现他不过是一个语法糖。 实际是通过下面的代码来实现的&#xff1a; <% page language&quo…

山西财大华商学院计算机系,山西财经大学华商学院

山西财经大学华商学院&#xff0c;位于山西省太原市&#xff0c;是经国家教育部正式批准设立&#xff0c;由山西财经大学在2002年举办的一所全日制本科院校&#xff0c;学院紧邻山西财经大学主校区&#xff0c;目前在校学生4500余人。山西财经大学是新中国成立后建校最早的财经…

sed 解释正则表达式

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

计算机usb无法读取u盘启动,U盘中毒后造成U盘启动盘制作失败usb无法识别的解决办法...

我们想用U盘作为装系统的工具&#xff0c;必须先保证U盘的安全才能作为U盘启动盘使用&#xff0c;如果U盘一旦损坏&#xff0c;将造成USB无法识别&#xff0c;装系统也就无从下手&#xff0c;下面先讲下U盘中毒后造成U盘损坏usb无法识别的情况&#xff1a;1、识别U盘速度变得缓…

在windows下codeblocks中配置pthread库

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

吕帅 计算机学院,刘磊-吉林大学计算机科学与技术学院

在《Journal of Systems and Software》、《Pattern Recognition》、《计算机学报》、《软件学报》等国内外期刊和会议上累计发表学术论文180余篇&#xff0c;其中&#xff1a;SCI检索论文40余篇、EI检索论文100余篇。主要代表性学术论文(SCI检索学术论文、国内权威期刊论文)&a…

河南科技大学计算机基础题库,河南科技大学大学计算机基础Excel基本操作选择题汇总...

Excel基本操作1、在Excel工作表的单元格中&#xff0c;如要输入数字字符串100083(邮政编码)时&#xff0c;应输入____C___。A) 100083 B) "100083" C) 100083 D) 1000832、在单元格B1中输入数值2&#xff0c;B2中输入数值3.5&#xff0c;选定单元格区域 B1:B5&#x…

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

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

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

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