•        介绍
•        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. HTTP代理服务器搭建

    由于在某些特定场景下,我们的外网访问会受到限制,如果有一些访问需求的话就需要一个代理作为中转了. 首先需要一台机器作为中转的服务器,这时候当然要去阿里云买一台啦.操作系统一定要选Linux,我使用的是 ...

  2. jQuery---手风琴案例

    手风琴案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  3. centos 安装桌面

    centos7.*安装 1,安装 yum groupinstall "KDE Plasma Workspaces" 2.启动 startx

  4. Scrum简介

    1. 什么是Scrum Scrum是一种轻量级的框架,适合于小型的.结合紧密的团队开发复杂的产品.Scrum是二十世纪后期一些软件工程师协同努力的脑力劳动的成果,现已成为技术领域最具魅力的方法.但Sc ...

  5. 401 WebEx会议教程一 —— 参加会议

    · WebEx会议教程一 —— 参加会议 参加他人发起的会议 1.  在邀请邮件中,接受对方的会议邀请: 2.  一般在WebEx会议开始前15分钟时,邮箱客户端会提醒您 (如下图类似提示) 3.   ...

  6. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.23)-- Format NVM command

    5.23 Format NVM command - NVM Command Set Specific Format NVM命令用于低级格式化NVM媒介.这个命令被host主机使用,来变更LBA数据大小 ...

  7. C++——深拷贝

    要实现深拷贝就需要自己编写拷贝构造函数. 深拷贝 #include<iostream> using namespace std; class Point { public:         ...

  8. linux - 异常:安装包冲突 conflicts with

    问题描述 解决方案 删除冲突的包 命令格式:yum -y remove 包名 yum -y remove httpd24u yum -y remove httpd24u-tools

  9. No module named ‘sklearn.model_selection解决办法

    在python中运行导入以下模块 from sklearn.model_selection import train_test_split 出现错误:  No module named ‘sklear ...

  10. 通过css修改input的边框

    input{ border:1px solid #d2d2d2; background-color:transparent; } 可以看到主要是把背景色调成透明的颜色,从而来进行边框的设置