写游戏代码,往往最终需要代码为连续的事件.结果会像这样:
[它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行。]

private int state = 0;
void Update()
{if (state == 0) {//做步骤0state = 1;return;}if (state == 1) {// 做步骤1state = 2;return;}// ...
} 

往往使用yield语句更为方便.yield语句是一个特殊的返回类型,它确保函数从yield语句的下一行继续执行.

while(true) {// 做步骤0yield return 0;// 等待一帧// 做步骤1yield return 2;// 等待两帧// ...
} 

你也可以传递时间值到yield语句,Update函数会在yield结束后执行下一语句.

  // do somethingyield return WaitForSeconds  (5.0);//等待5秒// do something more...  

你可以入栈并连接协程.

这个例子将执行Do,但是do函数之后的print指令会立刻执行.

Do ();
Console.WriteLine("This is printed immediately");
IEnumerator  Do ()
{Console.WriteLine("Do now");yield return new WaitForSeconds  (2);      Console.WriteLine("Do 2 seconds later");
} 

这个例子将执行Do,并等待,直到Do完成再执行其他语句.【注:这里的等待是把线程时间交给其他任务,而不是阻塞式等待】

// 启动协程
yield return StartCoroutine("Do");
Console.WriteLine("Also after 2 seconds");
Console.WriteLine ("这个print将在Do协程执行完以后显示。");
IEnumerator  Do ()
{
Console.WriteLine("Do now");
yield return new WaitForSeconds  (2);
Console.WriteLine("Do 2 seconds later");
}

任何事件处理程序都可以是协同程序 。

注意你不能在Update或FixedUpdate函数内使用yield,但是你能使用 StartCoroutine  开始一个函数.

查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine  and MonoBehaviour.StartCoroutine  可以获得更多使用yield的信息.
yield return可以看做是一种特殊的return,会返回到父类继续执行,但是yield return后面的类型或方法会有一个执行条件,当条件满足时会回调包含yield的子函数,例如下面代码
例1:

void Start () {print("Starting:" + Time.time);StartCoroutine(WaitAnPrint(2.0F));print("Before WaiAndPrint:" + Time.time);}IEnumerator WaitAndPrint(float waitTime){yield return new WaitForSeconds(waitTime);print("WaitAndPrint:" + Time.time);    }

在执行yield return new WaitForSeconds(waitTime)时暂停的条件没有满足,故返回到start函数中继续执行,直到满足条件后再回调WaitAndPrint,所以输出为:

Starting:0

Before WaiAndPrint:0

WaitAndPrint:2.12291

例2:

IEnumerator Start(){print("starting:" + Time.time);yield return StartCoroutine(WaitAndPrint(2.0F));print("done:" + Time.time);}IEnumerator WaitAndPrint(float waitTime){yield return new WaitForSeconds(waitTime);print("WaitAndPrint:" + Time.time);    }

因为start为顶级函数,所以会阻塞在这里,直到StartCoroutine(WaitAndPrint(2.0F))执行完毕,输出为:

starting:0

WaitAndPrint:2.00315

done:2.00315





















												

Unity3D之协程(Coroutines Yield )相关推荐

  1. 学习|Unity3D使用协程实现减速停车效果

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4303字,预计阅读11分钟 前言 上一篇<学习|Unity3d的导航实现循环线路移动>讲了一下定制循环行驶路线的方 ...

  2. 学习笔记(35):Python网络编程并发编程-协程(yield,greenlet,gevent模块)

    立即学习:https://edu.csdn.net/course/play/24458/296457?utm_source=blogtoedu 协程(yield,greenlet,gevent) 1. ...

  3. 理解Python的协程机制-Yield

    根据PEP-0342 Coroutines via Enhanced Generators,原来仅仅用于生成器的yield关键字被扩展,成为Python协程实现的一部分.而之所以使用协程,主要是出于性 ...

  4. unity update 协程_Unity协程,停止协程及yield return使用_019

    public void Start() { //开启协程 Coroutine testCoroutine = StartCoroutine(Test()); //停止指定协程 StopCoroutin ...

  5. python3之协程(2)---yield与send实现协程操作

    原文链接:https://www.cnblogs.com/vipchenwei/p/7049404.html yield与send实现协程操作 之前我们说过,在函数内部含有yield语句即称为生成器. ...

  6. Unity 新手入门 如何理解协程 IEnumerator yield

    Unity 新手入门 如何理解协程 IEnumerator 本文包含两个部分,前半部分是通俗解释一下Unity中的协程,后半部分讲讲C#的IEnumerator迭代器 协程是什么,能干什么? 为了能通 ...

  7. Unity3d 通过协程来实现文件的全部加载后执行

    相信大家会经常遇到在游戏中需要WWW从本地或者服务器上获取数据,而我们通常容易会犯下面这种个错误:当数据较少或者网速较好时程序运行正常.而当数据较大或者网速不好时程序会出错误.比如卡住. 所以我们要使 ...

  8. Unity中协程的yield return

    记录Unity中对于协程常用的一些操作 不管是对于网络请求或加载资源时以及一些相对来说比较耗费时间的运算时,我们不希望会全部写在Update中来占用大量主线程的资源. 协程 : IEnumerator ...

  9. 协程Coroutines入门

    添加依赖: dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0") ...

最新文章

  1. oracle如何上传图片,js实现上传图片之上传前预览图片
  2. java集合框架图(二)
  3. 自学python需要下载什么软件-学python下载什么软件开发
  4. php json对象取数据类型,PHP如何科学地json_encode类对象数据
  5. matlab中转置和裁剪,对Matlab中共轭、转置和共轭装置的区别说明
  6. 状态压缩 DP AHU420
  7. 浅谈JavaScript 面向对象编程[转]
  8. linux源码包编译安装与rpm安装方法介绍
  9. dynamic和匿名对象
  10. Qt工作笔记-保存textEdit中的数据,并自动打开文件
  11. Linux 6.5选包截图
  12. 本部裁员、分部招人,科技公司的岗位都奔向了外地?
  13. ZJOI2019 线段树
  14. matlab strel
  15. Python正则表达式:最短匹配
  16. linux ext2 文件系统学习
  17. 从实例中学习grid布局
  18. 计算机里的音乐怎么设置,realtek高清晰音频管理器怎么设置
  19. 固体物理期末3套试题
  20. Zemax实现微透镜阵列光束整形(原理+仿真)

热门文章

  1. ios从打包到上架全过程
  2. CASIA -HWDB2.0-2.2和OLHWDB2.0-2.2数据集解析
  3. 什么是软件形式化方法
  4. 蓝牙耳机+大鼠标垫+笔记本电脑支架
  5. java 秒表_JAVA计时器秒表程序代码
  6. 讲座报名|美团无人机团队技术分享:大规模、高精度激光SLAM
  7. 底层嵌入式之NOR FLASH编程
  8. 苹果微信点开才会收到信息_最新!苹果突然承认:iPhone12是问题产品
  9. Elasticsearch学习第二篇--常用的几种搜索方式
  10. HASH和HMAC(3):SHA-1算法原理