测试1:

  

using UnityEngine;
using System.Collections; public class test1 : MonoBehaviour { // Use this for initialization
void Start ()
{
Debug.Log("in start " + Time.time.ToString());
StartCoroutine(callYieldFunction()); //必须要用StartCoroutine
Debug.Log("in start 2 " + Time.time.ToString());
} // Update is called once per frame
void Update () { } IEnumerator callYieldFunction()
{
Debug.Log("callYieldFunction " + Time.time.ToString());
//yield return StartCoroutine(callYieldFunction1());
StartCoroutine(callYieldFunction1());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 2 seconds " + Time.time.ToString());
} IEnumerator callYieldFunction1()
{
Debug.Log("callYieldFunction1 " + Time.time.ToString());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 4 seconds " + Time.time.ToString());
}
}

  运行结果为

  in start 0

  callYieldFunction 0

  callYieldFunction1 0

  in start 2 0

  callYieldFunction print after 4 seconds 2.004971

  callYieldFunction print after 2 seconds 2.004971

  

测试2:

  

using UnityEngine;
using System.Collections; public class test1 : MonoBehaviour { // Use this for initialization
void Start ()
{
Debug.Log("in start " + Time.time.ToString());
StartCoroutine(callYieldFunction()); //必须要用StartCoroutine
Debug.Log("in start 2 " + Time.time.ToString());
} // Update is called once per frame
void Update () { } IEnumerator callYieldFunction()
{
Debug.Log("callYieldFunction " + Time.time.ToString());
yield return StartCoroutine(callYieldFunction1());
//StartCoroutine(callYieldFunction1());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 2 seconds " + Time.time.ToString());
} IEnumerator callYieldFunction1()
{
Debug.Log("callYieldFunction1 " + Time.time.ToString());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 4 seconds " + Time.time.ToString());
}
}

  运行结果为:

  in start 0

  callYieldFunction 0

  callYieldFunction1 0

  in start 2 0

  callYieldFunction print after 4 seconds 2.002947

  callYieldFunction print after 2 seconds 4.007511

结果:

  需要注意的是StartCoroutine(callYieldFunction());这句必须要加StartCoroutine,不然callYieldFunction()里面根本不会运行。

 1:StartCoroutine里面的函数是个闭包,主线程运行这个闭包,直到yield return,闭包中剩下的代码不运行,跳出闭包,运行主线程别的代码;
2:主线程在下一帧运行yield return后面的函数(估计是把所有闭包放在一个list里面,每帧的一个特点时间执行list里面的闭包)。
3:整个闭包应该保存了堆栈信息

yield return的作用的更多相关文章

  1. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  2. C#中的using和yield return混合使用

    最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IEnumerable<T>了.我的代码里还有 ...

  3. C#中的yield return与Unity中的Coroutine(协程)(上)

    C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一 ...

  4. using和yield return

    C#中的using和yield return混合使用 最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IE ...

  5. yield return的用法简介

    使用yield return 语句可一次返回一个元素. 迭代器的声明必须满足以下要求: 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 I ...

  6. yield学习续:yield return迭代块在Unity3D中的应用——协程

    必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并 ...

  7. C#中yield return用法分析

    这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文 ...

  8. C#中的yield return与Unity中的Coroutine(协程)(下)

    Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image using ...

  9. 12.C#yield return和yield break及实际应用小例(六章6.2-6.4)

    晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在其中出现的方法.运算符或get访问器是迭代器,通过使用 ...

随机推荐

  1. Objective-C的新特性

    Objective-C的新特性 苹果在今年的 WWDC2012 大会上介绍了大量 Objective-C 的新特性,能够帮助 iOS 程序员更加高效地编写代码.在不久前更新的 Xcode4.4 版本中 ...

  2. Load Mental Ray in Maya 2015

    In Maya 2015, we usually use mental ray to render our model, some new users may not see the mental r ...

  3. marquee标签

    页面的自动滚动效果,可由javascript来实现, 但是有一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee ...

  4. php链接mysql数据库

    php连接数据库有三种方法,刚刚发现通过mysql_connect,mysql_query连接已被废弃,而现在推荐的是通过“面向对象方法”和“PDO方法”连接数据库. 而我在使用面向对象的方法连接时, ...

  5. jquery_事件与动画

    事件绑定 bind(type[,data],fn)(无限触发) type:事件类型包括jquery中已有事件也可以自定义事件 data:可选参数,作为event.data属性传递给事件对象的额外数据对 ...

  6. 实验四 Android开发基础

    实验四 Android开发基础 实验内容 1.安装Android Studio 2.运行安卓AVD模拟器 3.使用安卓运行出虚拟手机并显示HelloWorld以及自己的学号 (一)SDK的安装 (二) ...

  7. 关于格式转换 “%a.bs”

    这个形式的格式转换符用于输出, 如果a <= b,  那么输出的字符串串长大于等于a, 小于b; 否则, 输出的串长按照a指定的输出. (不够,用空格补齐)

  8. Shell编程中括号判断中赋值语句和判断语句

    #!/bin/bash declare var="xxx" # without space and use one = #1.judge whether the assignmen ...

  9. Properties类使用

    package com.emolay.util; import java.io.IOException; import java.io.InputStream; import java.util.Pr ...

  10. fopen w c

    http://php.net/manual/en/function.fopen.php