Unity3D的协程概括地将就是:对于一段程序,你可以加上yield标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码。协程的作用:①延迟一段时间执行代码。②等某个操作完成之后再执行之后的操作。

  总结起来就是一句话:控制一段代码在特定的时机执行。

  Unity3D协程的核心在于“yield return"命令,这句代码的意义是马上停止当前函数,然后在下一帧中从这里重新开始。举个例子:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class CoroutineCountdown : MonoBehaviour
  6. {
  7. public float floattimer;
  8. public float timer;
  9.  
  10. void Start()
  11. {
  12. StartCoroutine(Countdown());
  13. }
  14.  
  15. IEnumerator Countdown()
  16. {
  17. int seconds = ;
  18. while (true)
  19. {
  20. //timer累加到1时,相当于运行了1秒后,会timer大于1,不会执行yield return 0,而结束循环
  21. //接着执行second++;second通过log对用户可见,随着程序执行,每过1秒输出累加时间值1,2,3。。。
  22. for (float timer = ; timer < ;)
  23. {
  24. yield return ;
  25. timer += Time.deltaTime;
  26. }
  27. seconds++;
  28. Debug.Log(seconds + " seconds have passed since the Coroutine started.");
  29. }
  30. }
  31. }

  在timer满足循环条件,即timer小于1时,会执行yield return 0,这时候会停止countdown函数,然后在下一帧中重新从yield处开始执行;所以在进入下一帧时会先在运行一次yield return 0语句,然后是timer+=Time.deltaTime,当timer大于1时,这时候不满足循环的判断条件,这时候会结束循环。接着运行下一行代码:second++,对Second累加1,并输出Log信息。

  在Console窗口中会输出log信息,可见Second每秒累加1次。其实每次输出log信息时,

  

  另外注意,结束一个协程需要使用协程函数的字符串形式:StopCoroutine("Countdown");

  协程是 Unity 3D的一种官方的加载方式,好处是能让代码看起来更“同步”(sync)一些。协程不是线程,也不是异步执行(async)的。协程和 MonoBehaviour 的 Update函数一样也是在MainThread中执行的。使用协程你不用考虑同步和锁的问题。资源在 yield 返回后即可使用,代码比回调的方式容易组织。

Unity3D协程yield的理解的更多相关文章

  1. Unity3D 协程的介绍和使用

    我是快乐的搬运工 http://blog.csdn.net/u011397120/article/details/61236055 ---------------------------------- ...

  2. U3D协程yield的使用和理解

    部分内容参考网址:http://blog.csdn.net/huang9012/article/details/29595747 Win7+U3D 4.6.7 1.在c#中使用①首选需要定义一个返回值 ...

  3. Unity3D 协程 浅谈

    协程 理解:协程不是线程,也不是异步执行(知道就行). 1.协程和MonoBehaviour的Update函数一样,也是在MainThread中执行的(一定得明白这句话意思). void Start ...

  4. [转]Unity3D协程介绍 以及 使用

    作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...

  5. Unity3d 协程的注意问题(新手须注意,老手须加勉)

    关于unity3d的协程,非常的好用,比如等待几秒执行,等待下一帧执行等! 但是也有潜在的问题: 1.协程是单线程的,在主线程中完成 2.如果发现yield, 那么这一帧会结束,那么等下一帧调用此脚本 ...

  6. Unity3d 协程

    参考文章: http://blog.csdn.net/onafioo/article/details/48979939 http://www.cnblogs.com/zhaoqingqing/p/37 ...

  7. Unity3D协程

    协程介绍 Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自己的集合类型编写枚举器.这一点你不必关注太多,我们直接进入一个简单的例子来看看协程到底能干什么.首 ...

  8. Unity3D协程介绍 以及 使用

    作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...

  9. python协程--yield和yield from

    字典为动词“to yield”给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 next(...) 的 ...

随机推荐

  1. Jquery实现点击表格行变色!

    时隔一年左右,学习了新的知识,从尝试Linux部署项目,网络安全,至后端开发,然后用起了Jquery, 而且是必须要做.也让自己见识可能会更广泛一些.对于一个刚毕业的大学生而言.方正我是没有用过jqu ...

  2. 调试HDF0308-A50的相机驱动。

    使用rk3128做为主芯片: 使用andriod5.1-sdk软件包. 1.在rk3128-86v.dts 中加入头文件 #include "rk3128-cif-sensor.dtsi&q ...

  3. 2017.2.6Redis连接问题排查

    现象:早8:15起开始收到redis主从不停切换的报警短信,某系统连接流控redis报超时. 排查:1.查看zabbix,看流控系统的redis服务器是否正常——正常: 2.查看redis监控,red ...

  4. [Ting's笔记Day9]活用套件Carrierwave gem:(4)使用Imagemagick修改图片大小

    前情提要: 这几天我都在实验Carrierwave这套图片上传套件,也顺利部署到Heroku架站正式环境了.:) 接下来我遇到了新的问题:要如何在上传的时候,让Carrierwave gem大型siz ...

  5. vue中less文件全局引用

    1.先安装sass-resources-loader   npm install sass-resources-loader 2.然后在build->utils.js修改less配置 在less ...

  6. leetcode268缺失数字

    int missingNumber(int* nums, int numsSize) { ) /; ;i<numsSize;i++){ sum = sum - nums[i]; } return ...

  7. Window上编译最新版libCef(Branch 2704)(转载)

    转自http://blog.csdn.net/mfcing/article/details/52066579 1.开发环境搭建   VS2010及以上版本,CMake 2.8.12.1及以上版本.我安 ...

  8. I/O多路复用、协程、线程、进程

    select注册fd,阻塞,当有fd状态改变时返回,确认对应的fd,做下一步处理.简单来说就是先注册,注册完后休眠并设置一个定时器醒来查看,有事件就通知来取,进行后续动作,没事件就继续睡,再设闹钟.用 ...

  9. 重启虚拟机后dhclient进程未运行解决办法

    问题分析 重启虚拟机后,dhclient进程未运行的根因通常为: 1.NetworkManager未开启自启动导致的dhclient进程未运行 2.网卡设置未纳入NetworkManager管理导致的 ...

  10. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...