部分内容参考网址:http://blog.csdn.net/huang9012/article/details/29595747

Win7+U3D 4.6.7

1.在c#中使用
①首选需要定义一个返回值为IEnumerator的协程函数

 IEnumerator Do(){
Debug.Log("Do 1"); yield return ; //下面的代码延时到下一帧的update之后 Debug.Log("Do 2");
}

②使用StartCoroutine函数调用协程函数

     void Start () {
Debug.Log("Start 1");
StartCoroutine(Do()); //调用协程函数
Debug.Log("Start 2");
}

③在Update函数中输出数字,判断Updata函数和协程之间的执行先后顺序

 int i = ;
void Update () {
++i;
Debug.Log("Update " +i); //这里记录了调用update函数多少次
}

④在LateUpdate函数中输出数字,判断LateUpdate函数和协程之间的执行先后顺序

 int j = ;
void LateUpdate()
{
++j;
Debug.Log("LateUpdate " + j); //这里记录了调用update函数多少次
}

⑤运行的输出顺序结果是:

 Start
Do //yield之后再下一帧的update之后继续执行
Start
Update //第一帧(当前帧)update执行完
LateUpdate //第一帧(当前帧)的最后执行
Update //第二帧(下一帧执行)update执行完
Do //执行yield之后的代码
LateUpdate //没错,LateUpdate在协程之后
Update
LateUpdate
Update
LateUpdate
Update
LateUpdate …

2.关于协程的理解:
①在传统实时游戏中,在update中要延迟执行一些代码,或者满足一定条件后执行一些代码。需要在update添加一个计时器,用当前时间来减去前面记录的时间来判断执行。当这种情况越来越多的时候,会添加很多变量和代码,代码就越来越乱,这时候一般会抽象一个框架出来处理这个问题。协程就是解决这种问题的框架,换句话说yield return 0(return的是int值,任何值都一样,没有区别)的作用,就是在调用yield那行代码后(在yield函数处做一个记录标签),然后跳出协程函数继续执行外部的代码,在下一帧(是下一帧!)的update函数之后,根据yield函数的记录标签位置继续执行协程函数的后面部分代码。

yield return int是等待下一帧(应用场景:倒计时,分数累加,血条慢慢减少等)
yield return new new WaitForSeconds (2)是等待时间到
yield return new WWW(“http://chevin.net”)是等到页面响应
③协程和Update()一样更新,自然可以使用Time.deltaTime了,而且这个Time.deltaTime和在Update()当中使用是一样的效果(使用yield return int的情况下)
④协程并不是多线程,它和Update()一样是在主线程中执行的,所以不需要处理线程的同步与互斥问题
⑤yield return null其实没什么神奇的,只是unity3d封装以后,这个协程在下一帧就被自动调用了

3.为了更清楚的说明yield return int的下一帧执行的用处,分别使用两种方法实现同一个延时功能。
①使用update不断累加时间

 using UnityEngine;
using System.Collections; public class dialog_easy : MonoBehaviour {
public string dialogStr = "一个一个字显示";
public float speed = 5.0f; private float timeSum = 0.0f;
private bool isShowing = false;
// Use this for initialization
void Start () {
ShowDialog();
} // Update is called once per frame
void Update () {
if(isShowing){
timeSum += speed * Time.deltaTime;
guiText.text = dialogStr.Substring(, System.Convert.ToInt32(timeSum)); if(guiText.text.Length == dialogStr.Length)
isShowing = false;
}
} void ShowDialog(){
isShowing = true;
timeSum = 0.0f;
}
}

②使用yield return int每帧自动调用(明显这种用法简洁明了得多)

 using UnityEngine;
using System.Collections; public class dialog_yield : MonoBehaviour {
public string dialogStr = "一个一个字显示";
public float speed = 5.0f; // Use this for initialization
void Start () {
StartCoroutine(ShowDialog());
} // Update is called once per frame
void Update () {
} IEnumerator ShowDialog(){
float timeSum = 0.0f;
while(guiText.text.Length < dialogStr.Length){
timeSum += speed * Time.deltaTime;
guiText.text = dialogStr.Substring(, System.Convert.ToInt32(timeSum));
yield return null;
}
}
}

U3D协程yield的使用和理解的更多相关文章

  1. Unity3D协程yield的理解

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

  2. tornado 协程的实现原理个人理解;

    tornado实现协程的原理主要是利用了(1)python里面的generator (2)future类和ioloop相互配合,两者之间的相互配合是通过gen.coroutine装饰器来实现的: 具体 ...

  3. python协程--yield和yield from

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

  4. python协程(yield、asyncio标准库、gevent第三方)、异步的实现

    引言 同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行的. 例如购物系统中更新商品库存,需要用"行锁"作为通信信号,让不同的更新 ...

  5. U3D协程Coroutine之WWW与Update()的并行测试

    using System.Collections; using UnityEditor; using UnityEngine; using UnityEngine.UI; /************* ...

  6. (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块

    一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...

  7. 多任务3(协程)--yield完成多任务交替执行

    协程是并发,单线程,一次执行一个 来回切换 代码: import time def task_1(): while True: print("-----1-----") time. ...

  8. 协程,yield,i多路复用,复习

    课程回顾: 线程池 队列:同一进程内的队列 先进先出 后进先出 优先级队列 线程池中的回调函数是谁在调用? 线程池中的回调函数是子线程调用的,和父线程没有关系 进程池中的会点函数是父进程调用的,和子进 ...

  9. 深入理解协程(二):yield from实现异步协程

    原创不易,转载请联系作者 深入理解协程分为三部分进行讲解: 协程的引入 yield from实现异步协程 async/await实现异步协程 本篇为深入理解协程系列文章的第二篇. yield from ...

随机推荐

  1. HTML鼠标悬停改变样式

    a.tt:hover {color: #FF0000;} <a class="tt" href="test.html">test</a> ...

  2. #C++初学记录(sort函数)

    sort函数 前言:当进行贪心算法的学习时,需要用到sort函数,因为初学c++汇编语言,sort的具体用法没有深入学习,所以这里进行sort学习记录并只有基础用法并借用贪心算法题目的代码. 百度百科 ...

  3. mysql5.7服务器The innodb_system data file 'ibdata1' must be writable导致无法启动服务器

    现象如下:The innodb_system data file 'ibdata1' must be writable. 解决方案如下: 1.关闭mysqld进程: 2.删除配置文件中datadir所 ...

  4. 集合框架—常用的map集合

    1.Collections.synchronizedMap() 实现上在调用map所有方法时,都对整个map进行同步,而ConcurrentHashMap的实现却更加精细,它对map中的所有桶加了锁. ...

  5. HIT 2051

    这题说的是 一辆汽车 每走一单位的距离就消耗一单位的燃料,然后,他要回城里去,当然他与城镇之间有n个加油站 ,他的油箱可以为 无穷大 ,这样分析后发现进不进汽油站 与 汽油站在哪无关 ,只与加油站的 ...

  6. # 20155327 2016-2017-3 《Java程序设计》第5周学习总结

    20155327 2016-2017-3 <Java程序设计>第5周学习总结 教材学习内容总结 理解异常架构 粉红色的是受检查的异常(checked exceptions),其必须被 tr ...

  7. 谷歌插件--Advanced REST client

    早上在测试调用服务去获取数据的时候,因为自己的单元测试不是很熟悉,问了同事,同事给我介绍了一个插件Advanced REST client,这个可以在谷歌的“扩展与应用”中找打,使用 安装之后会提示要 ...

  8. Hive sql和Presto sql的一些对比

    最近由于工作上和生活上的一些事儿好久没来博客园了,但是写博客的习惯还是得坚持,新的一年需要更加努力,困知勉行,终身学习,每天都保持空杯心态.废话不说,写一些最近使用到的Presto SQL和Hive ...

  9. Java EE业务处理流程与XML的引入

    Java EE基于MVC架构的业务处理流程 MVC架构业务处理流程 XML定义 XML是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言.XML被设计用于数据的存 ...

  10. MySQL数据库----触发器

    触发器-trigger 触发器:监视某种情况,并触发某种操作. 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 -- 触发器:某种程序触发了工具的运行 -- 触发器不能主 ...