之前一直很纠结这个问题,在网上找到了这篇文章,给大家分享下: 
第一种方法:   
 void Start() 
    { 
        print("Starting " + Time.time);----------------------------------------1 
        StartCoroutine(WaitAndPrint(2));-------------------------------------2 
        print("Done " + Time.time);-------------------------------------------3 
    } 
    IEnumerator WaitAndPrint(float waitTime) 
    { 
        yield return new WaitForSeconds(waitTime);------------------------4 
        print("WaitAndPrint " + Time.time);----------------------------------5 
    } 
该段代码的执行顺序是12435 
IEnumerator Start() 
    { 
        print("Starting " + Time.time);----------------------------------------1 
        yield return StartCoroutine(WaitAndPrint(2.0F));------------------------2 
        print("Done " + Time.time);------------------------------------------3 
    } 
    IEnumerator WaitAndPrint(float waitTime) 
    { 
        yield return new WaitForSeconds(waitTime);----------------------------4 
        print("WaitAndPrint " + Time.time);-----------------------------------------5 
    } 
该段代码的执行顺序是12453 
. 在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该 MonoBehaviour中的协同程序。 
      4. 还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程 序并不会再开启;如是将协同程序所在脚本的enabled设置为false则不会生效。这 
是因为协同程序被开启后作为一个线程在运行,而 
MonoBehaviour也是一个线程,他们成为互不干扰的模块,除非代码中用调用,他们共同作用于同一个对象,只有当对象不可见才能同时终止这两个线 
  
程。然而,为了管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样我们在编程时就可以方便的调用指定脚本 
  
中的协同程序,而不是无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计保证了对象、脚本的条理化管理,并防止了重 
 名。

注意:

  • 在unity C#中yield(中断)语句必须要在IEnumerator类型里
  • C#方法,方法的返回类型为IEnumerator,返回值如(eg: yield return new WaitForSeconds(2); 或者 yield return null;)。
  • yield不可以在Update或者FixedUpdate里使用。
C#中的Coroutine与JavaScript中的区别:

    1:Coroutines 必须要是 IEnumerator 返回类型:

IEnumerator MyCoroutine() 
        { //This is a coroutine }

  2:在C#中要使用 yield return而不是yield : 
        Remember that we need to return an IEnumerable, so the Javascript yield; becomes yield return 0; in C#         IEnumerator MyCoroutine() 
            { 
                DoSomething(); 
             yield return 0; 
            //Wait one frame, the 0 here is only because we need to return an IEnumerable 
             DoSomethingElse(); 
           } 
    since C# requires you to use the new operator to create objects, if you want to use WaitForSeconds  you have to use it like this:

IEnumerator MyCoroutine() 
     { 
       DoSomething(); yield return new WaitForSeconds(2.0f); //Wait 2 seconds DoSomethingElse(); 
      }

3:调用Coroutine要使用 StartCoroutine 方法:

public class MyScript : MonoBehaviour 
{ void Start() 
    { 
        StartCoroutine(MyCoroutine()); 
    } 
  
    IEnumerator MyCoroutine() 
    { //This is a coroutine } 
}

详细参考官网:http://docs.unity3d.com/Documentation/Manual/Coroutines.html

线程Coroutines 和 Yield(转)的更多相关文章

  1. 线程同步之 yield() wait()

    yield()没有参数. sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出CPU占有权,但让出的时间是不可设定的.yiel ...

  2. 线程同步以及 yield() wait()和notify()、notifyAll()

    1.yield() 该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会. 2.wait()和notify().notifyAll() 这 ...

  3. 线程同步以及yield()、wait()、Notify()、Notifyall()

    一.线程同步 1.线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏. 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对 ...

  4. Java线程sleep,yield,join,wait方法详解

    1.sleep() 当一个线程调用sleep方法后,他就会放弃cpu,转到阻塞队列,sleep(long millis)方法是Thread类中的静态方法,millis参数设定线程睡眠的时间,毫秒为单位 ...

  5. 线程中的yield()

    属于本地方法 /** * A hint to the scheduler that the current thread is willing to yield * its current use o ...

  6. 【多线程】线程礼让 Thread.yield()

    线程礼让 Thread.yield() 礼让线程,让当前正在执行的线程暂停,但不阻塞 : 将线程从运行状态转为就绪状态 : 让cpu重新调度,礼让不一定成功!看CPU心情. 代码示例: /** * @ ...

  7. 线程入门之yield

    package com.thread; /** * <yiedl:把cpu让给其他线程> * <功能详细描述> * * @author 95Yang */ public cla ...

  8. Java线程--interrupt join yield setDaemon常用方法的使用

    概念: 操作系统可以有多个进程,一个线程可以有一个或多个线程.进程与进程之间不共享内存,都在各自的空间中运行.而线程不仅可以共享内存,还可以用有一个自己的内存空间,叫做线程栈. 线程又称轻量级进程.J ...

  9. java线程学习之yield方法

    yield方法是暂停当前正在执行的线程对象,并执行其他线程. 这是一个静态方法,一旦执行,它会使当前线程让出CPU.让出的cpu并不代表当前线程不执行了.当前线程让出CPU后,还会CPU资源的争夺,但 ...

随机推荐

  1. SQL SERVER 2012 第五章 创建和修改数据表 の CREATE语句

    CREATE <object type> <object name> CREATE DATABASE <database name> 比较完整的语法列表: 日志文件 ...

  2. Eclipse 中 新建maven项目 无法添加src/main/java 问题

    eclipse创建maven web项目,在选择maven_archetype_web原型后,默认只有src/main/resources这个Source Floder. 按照maven目录结构,添加 ...

  3. Python的环境变量设置

    python安装完成后,它的配置很简单,只需要配置下环境变量就可以了. 具体来讲,就是将python的安装目录加入到系统的path中即可.

  4. crontab使用简介

    crontab的配置文件: 前四行是用来配置crond任务运行的环境变量 第一行SHELL变量指定了系统要使用哪个shell,这里是bash 第二行PATH变量指定了系统执行命令的路径 第三行MAIL ...

  5. C++ std::tr1::bind使用

    1. 简述 同function函数相似.bind函数相同也能够实现相似于函数指针的功能.但却却比函数指针更加灵活.特别是函数指向类 的非静态成员函数时.std::tr1::function 能够对静态 ...

  6. Meteor计时器

    Meteor有提供它自己的setTimeout和setInterval方法.这些方法被用于确保所有全局变量都具有正确的值.它们就像普通 JavaScript 中的setTimeout 和 setInt ...

  7. linux 解压zip文件

    linux 解压zip文件 学习了:https://blog.csdn.net/hbcui1984/article/details/1583796 unzip xx.zip

  8. 转: java DES的算法片码

    转自: https://www.zhihu.com/question/36767829 作者:郭无心链接:https://www.zhihu.com/question/36767829/answer/ ...

  9. POJ-2240 -Arbitrage(Bellman)

    题目链接:Arbitrage 让这题坑了,精度损失的厉害.用赋值的话.直接所有变成0.00了,无奈下,我仅仅好往里输了,和POJ1860一样找正环,代码也差点儿相同,略微改改就能够了,可是这个题精度损 ...

  10. 辛星浅析一次ajax的实现过程

    说到ajax,那绝对是一个老生常谈的话题,近些年ajax技术的使用颇为盛行. 以下我们就以jQuery为例来从一个真实的项目中看一下ajax的实例. 首先是前端页面,这个页面我们使用的是bootstr ...