•        介绍
•        Part 1. 同步等待
•        Part 2. 异步协程
•        Part 3. 同步协程
•        Part 4. 并行协程

1、介绍
  每个Unity脚本都有两个重要的功能:开始和更新。 前者的作用是当一个对象被创建后,在每一帧对后者进行调用。设计规定,下一帧只有更新结束才能开始。这样会出现一个设计局限:更新的持续时间不太容易超过一帧。
坦白而言,每个你能想到的自定义行为都能用开始和更新进行实现。然而,基于多帧的事件发生要难实现一些(例如动画,对白,等待,…)。这是因为其设定无法写入一个持续的流中,必须分段,分布在很多帧中。这往往让代码难写,维护也很困难。
如果能在短暂的单帧中不受任何约束那就非常完美了。如果你是程序员,那么肯定知道线程的概念。线程是并行执行的代码段,使用线程需要谨慎。这是因为当多线程不加限制地共享一个变量会出现问题。Unity的设计并不建议使用线程。然而,Unity提供了折中的方案:协程。协程持续超过一帧的时间。此外,协程可以在任意情况下中断和恢复执行。
协程是常规的C#函数,返回一个IEnumerator。为了执行协程(并不同于以往的函数),必须使用StartCoroutine 方法(UnityDoc)。例如:

void Start ()
{
// Execute A as a coroutine
StartCoroutine( A() );
} IEnumerator A ()
{
...
}

将A当做协程执行。StartCoroutine 方法立即终止,同时产生新的协程并行执行。

2、同步等待

  如果你之前用过协程,那么应该已经遇到过WaitForSeconds (float/int)。像继承YieldInstruction的其它类,它允许协程短暂的暂停。当用yield进行连接时, WaitForSeconds提供了一种方式去延迟剩余代码的执行。
下面的代码展示了如何使用协程:

IEnumerator A()
{
... yield return new WaitForSeconds(10f); ...
}

UML 的序列图如上(Wikipedia),验证了WaitForSeconds的作用。当调用协程(即调用A),它暂停执行,直到消耗一定的时间。这个等待称为同步,因为协程等待另一个操作的完成。

3、异步协程

  Unity还允许在现有协程中开启一个新的协程。最简单的方法就是使用StartCoroutine。这么调用的话,新生的协程会和以前的协程共存。它们不发生直接交互,最重要的是它们不会相互等待。与之前的同步等待相比,这种情况是异步的,两个协程不要试图保持同步。

IEnumerator A()
{
... // Starts B as a coroutine, and continue the execution
StartCoroutine( B() ); ...
}

需要注意的是,在这个例子中B是一个完全独立的协同程序。终止不会影响B,反之亦然。

4、同步协程

  可以执行嵌套的协程并等待其实行完毕。最简单的办法就是使用yield返回。

IEnumerator A()
{
... // Waits for B to terminate
yield return StartCoroutine( B() ); ...
}

值得注意的是,由于执行B期间暂停了A,这种特殊情况下不需要启动另一个协程。有人可能会像下面这样试图优化协程:

IEnumerator A()
{
... // Executes B as part of A
B(); ...
}

B的执行和普通函数有一样的效果,不同的是B是在单帧内执行的。相反,通过使用StartCoroutine,A已经暂定的同时下一帧可以开始进行。
引入这个例子是为了介绍更加复杂的例子,同步协程。

5、并行协程

   当协程通过StartCoroutine启动时,返回了一个特殊的对象。 这可以用来查询协程的状态,随时等待其结束。
下面的例子中,协程B是异步执行的。父类A可以继续执行直到B需要的时候。如果有必要,它可以为了同步等待让步于B的引用。

IEnumerator A()
{
... // Starts B as a coroutine and continues the execution
Coroutine b = StartCoroutine( B() ); ... // Waits for B to terminate
yield return b; ...
}

如果你想要开始几个并行协程的话这会非常有用,所有代码在同一刻运行:

IEnumerator A()
{
... // Starts B, C, and D as coroutines and continues the execution
Coroutine b = StartCoroutine( B() );
Coroutine c = StartCoroutine( C() );
Coroutine d = StartCoroutine( D() ); ... // Waits for B, C and D to terminate
yield return b;
yield return c;
yield return d; ...
}

这种新模式允许任意数量的并行计算,当这些并行计算终止时恢复执行。

Unity Coroutine详解(二)的更多相关文章

  1. Unity Coroutine详解(一)

    Unity 中协程是个非常强大的功能,其作用主要是用于游戏中的延时调用或者执行一连串的有时间间隔的事件流程,例如剧情对话等.简单总结了几点协程相关的知识点,旨在加深记忆,同时为初学者解惑. 1.协程. ...

  2. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  3. Unity Jobsystem 详解实体组件系统ECS

    原文摘选自Unity Jobsystem 详解实体组件系统ECS 简介 随着ECS的加入,Unity基本上改变了软件开发方面的大部分方法.ECS的加入预示着OOP方法的结束.随着实体组件系统ECS的到 ...

  4. Unity 灯光系统详解

    Unity 灯光系统详解 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  5. PopUpWindow使用详解(二)——进阶及答疑

      相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  6. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

  7. logback -- 配置详解 -- 二 -- <appender>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  8. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

  9. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

随机推荐

  1. html5的页面在IOS中,按钮 变成圆角怎么办?

      在button的css 中添加: -webkit-appearance: none;     border: none;     border-radius: 0; ok 的啦   文章来源:刘俊 ...

  2. 1级搭建类109-Oracle 12cR2 SI FS(Windows Server 2019)公开

    Oracle 12cR2 单实例文件系统在Windows Server 2019上的安装 在线查看

  3. 自主开发编程语言被指Python套壳,中科院开发者道歉

    中科院计算所团队“完全自主设计.开发和实现”的“木兰”编程语言是Python语言的套壳产品?针对近日这一网络质疑,1月17日,项目负责人.中科院计算所编译实验室员工刘雷在科学网上发表回应称,木兰语言在 ...

  4. Windows Live Writer 2012 安装配置

    Windows Live Writer 2012用起来比较舒服,可以直接编辑 在线博客文章 下载地址 http://g.live.com/1rewlive5-all/zh-cn/wlsetup-all ...

  5. ZOJ1310-Robot (BFS)

    The Robot Moving Institute is using a robot in their local store to transport different items. Of co ...

  6. TCL常用命令

    1.删除文件 file delete A file delete -force A 2.建立文件夹 file mkdir A file mkdir A/A 3.判断文件夹是否存在 file exist ...

  7. window snmp

    https://blog.csdn.net/weixin_30367543/article/details/99923014 https://jingyan.baidu.com/article/e3c ...

  8. Spring Boot2 快速入门教程-到上手

    Spring Boot2 教程合集 入门 纯 Java 代码搭建 SSM 环境 创建一个 Spring Boot 项目的三种方法 理解 Spring Boot 项目中的 parent 基础配置 配置文 ...

  9. pick the stone game

    我该如何去触摸这类问题嘞! 取石子游戏 1堆石子有n个,两人轮流取. 先取者第1次可以取任意多个,但不能全部取完. 以后每次取的石子数不能超过上次取子数的2倍. 取完者胜.先取者负输出"Se ...

  10. Docker学习(六)Dockerfile构建自定义镜像

    Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ...