Unity3D使用IEnumerator延时操作

@adens 12/28/2017 8:07:19 AM

Unity3D使用IEnumerator延时操作

1.基本使用 IEnumerator的方法

using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour  
{  
    IEnumerator Wait()  
    {  
        // suspend execution for 5 seconds  
        yield return new WaitForSeconds(5);  
        Debug.Log("Wait:"+Time.time);
    }  
    void Start()  
    {  
        print("Start: " + Time.time);  
  
        // Start function WaitAndPrint as a coroutine  
        StartCoroutine("Wait");  
        print("Done:" + Time.time);  
    }  
}

结果:

result

细节对比版

using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour  
{  
  
    IEnumerator Wait()
    {
        // suspend execution for 5 seconds  
        yield return new WaitForSeconds(5);
        Debug.Log("Wait:" + Time.time);
    }
    IEnumerator Start()
    {
        print("Start: " + Time.time);
        // Start function WaitAndPrint as a coroutine  
        yield return StartCoroutine("Wait");
        print("Done:" + Time.time);
    }
}

结果:

通过StarCoroutine的方法来启动一个新的Coroutine,Start方法也声明成一个IEnumerator类型的时候,当执行到yield 模块,就会进行阻塞,等待yield模块完成了之后再继续往下执行,而声名成普通类型的时候,当启动了新的Coroutine的时候,遇到yield了,并不会把整个Start阻塞,而是会记录下当前执行的位置,然后返回父函数中执行,每一帧过后会检测yield是否满足,当满足yield条件,则返回到yield后面执行。

2.带参数的使用方法

using UnityEngine;  
using System.Collections;  
  
public class ExampleClass : MonoBehaviour  
{  
    IEnumerator Wait(string value)
    {
        // suspend execution for 5 seconds  
        yield return new WaitForSeconds(5.0f);
        Debug.Log("Wait:" +value+ Time.time);

    }
    void Start()
    {
        Debug.Log("Start:" + Time.time);
        // Start function WaitAndPrint as a coroutine  
        StartCoroutine("Wait","stringvalue");
        Debug.Log("Done:" + Time.time);
    }
}

result

3.传入多个参数使用方法

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
IEnumerator Wait(string value,float time)
{
// suspend execution for 5 seconds
yield return new WaitForSeconds(time);
Debug.Log("Wait:" +value+ Time.time);

}
void Start()
{
Debug.Log("Start:" + Time.time);
// Start function WaitAndPrint as a coroutine
StartCoroutine(Wait("test value",3.0f));
Debug.Log("Done:" + Time.time);
}

}

result

4.对比方法2和方法3

1.方法2只可以传入一个值,方法3可以传入多个值。

2.方法3比方法2开销要小一些

3.方法3无法单独的停止这个协程,如果需要停止这个协程只能等待协同程序运行完毕或者使用StopAllCoroutine();方法。方法2 可以使用StopCoroutine(string methodName);来结束执行

还有一种终止Coroutine的方法,将gameObject的active属性设为False,但是设回true的时候并不会启动Coroutine。

但是将Coroutine所在的脚本设为enable = false并不能够将Coroutine停止,因为它跟Monobehavior是同层级的。

Last Modification : 12/28/2017 8:07:19 AM


In This Document