文档章节

unity 协程实现

liyong2
 liyong2
发布于 2015/08/25 21:13
字数 734
阅读 318
收藏 1

c#实现的协程样例代码: https://gist.github.com/liyonghelpme/87754c95e4a2d4e1f4c9

c#迭代器和Unity协程

c# 本身支持迭代器IEnumerator,可以封装函数的执行上下文,但是迭代器不支持嵌套迭代,而为了实现带堆栈支持的协程,需要对c#做扩展。

Unity 中协程的嵌套形式如下: yield return StartCoroutine(IEnumerator);

为了嵌套协程需要保存协程调用的堆栈信息,并且在IEnumerator结束的时候,继续执行上一层的IEnumerator.

因此Unity 封装了一个类Coroutine, 该类中保存有当前IEnumerator 等待的下一级IEnumerator(waitingFor) 以及当当前IEnumerator 执行结束的时候所要调用的上一级IEnumerator(ContinueWhenFinished).

这样协程的执行流程如下:

  1. 调用Unity StartCoroutine 接口

  2. Unity 创建一个 Coroutine 协程对象, 并初始化协程中的迭代器

  3. Unity 合适时机调用 协程中迭代器的 moveNext 方法

    这时候 Unity获取迭代器的Current 返回值;如果返回值为NULL 则Unity将对迭代器的执行加入到下一帧的循环中,否则根据返回值不同做不同的处理。

    如果返回值是一个new WaitForSeconds() 对象则将将协程加入到延迟回调队列里面;

    如果返回值是另外一个协程对象,则设置当前协程的waitFor 为这个新协程对象,并且设置新协程对象的ContinueWhenFinish 为当前协程。

协程创建

Unity 提供 StartCoroutine 接口用于创建一个协程, 创建完协程之后,将会调用协程Run接口,执行一下协程,若返回NULL,则将协程加入到下一帧执行队列中,否则根据情况来做不同的调度。

协程执行

在初始化StartCoroutine 的时候会执行一次协程;之后根据协程执行的返回结果,来做不同的调度; 返回NULL 调度下一帧继续执行;

返回另外一个协程对象,则配置两个协程的关系,同时停止调度当前协程,将子协程加入到调度队列里面;

返回Wait 则将当前协程加入到等待调度队列里面。

协程销毁

协程生命周期和Monobehavior 相绑定,当GameObject SetActive False的时候,所有协程都会停止。

在创建协程的时候,若协程将会加入到 Monobehavior的ActiveCoroutine 活跃协程列表中,接着执行一次协程;若协程本次执行完之后没有yield调用,则表示协程生命周期结束,之后调用的协程清理函数会清理掉协程。

否则协程会加入到延迟调用队列中。

当协程需要等待其它事件,或者其它协程的时候,协程引用计数+1,这样协程会在其它事件执行完之后,才检测是否执行清理工作。

© 著作权归作者所有

liyong2

liyong2

粉丝 51
博文 196
码字总数 64732
作品 0
广州
程序员
私信 提问
[Unity脚本运行时更新]C#5新特性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/82797533 洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号。 本文是该...

关尔Manic
2018/09/21
0
0
ILRuntime官方Demo笔记

调用/执行 热更中的方法 调用热更代码中方法,写在AppDomain中,记录一下主要几个方法: AppDomain.LoadAssembly 加载热更dll 执行热更代码的方法,有两种方式: appdomain.Invoke("HotFix_P...

赵青青
03/01
0
0
认真CS丨协程、RequireComponent、Serializefield

协程 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B执行过程中又调用C、C执行完毕后返回,B执行完毕后返回,最后是A执行完毕。所以子程序是通过栈实现的,一个线程就是执行...

weixin_38239050
2018/05/15
0
0
【Unity】多线程和主线程交互使用类——Loom工具分享(转载)

作者:D.S.Qiu 原文:Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 熟悉Unity的developer都知道在Unity中的线程不能使用Unity的对象,但可以使用Unity的值类型变...

何三思
2018/04/12
0
0
《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制

11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字 image 设置GameMgr image 11.2 游戏整体流程 下面GameMgr.cs最终代码预览,后面我们逐个讲解. usi...

杜增强
2018/10/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
18
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部