yield return的作用

测试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(2);
        Debug.Log("callYieldFunction print after 2 seconds " + Time.time.ToString());
    }

    IEnumerator callYieldFunction1()        
    {
        Debug.Log("callYieldFunction1 " + Time.time.ToString());
        yield return new WaitForSeconds(2);
        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(2);
        Debug.Log("callYieldFunction print after 2 seconds " + Time.time.ToString());
    }

    IEnumerator callYieldFunction1()        
    {
        Debug.Log("callYieldFunction1 " + Time.time.ToString());
        yield return new WaitForSeconds(2);
        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:整个闭包应该保存了堆栈信息

 

转载于:https://www.cnblogs.com/afan/p/3820837.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值