Unitydev征服Unity3d

Unity Coroutine

2014-06-14  本文已影响1229人  DonaldW

IEnumerator

IEnumerator i = oneEnumerable.GetEnumerator();
bool isIterating = true;
for(i; isIterating; isIterating = i.MoveNext())
{
    Object oneObject = i.Current;
    oneObject.XXX();
}

IEnumerable

foreach(Object oneObject in oneEnumerable)
{
    oneObject.XXX();
}

迭代器函数(iterator method)yield

public class OneEnumerator : IEnumerator
{
    public bool MoveNext() {... }
    public object Current { ... }
    
    public void Reset() { ... }
}
//用于普通循环
public IEnumerator SomeNumbers()
{
    yield return 3;
    yield return 5;
    yield return 8;
}

public void Test()
{
    IEnumerator i = SomeNumbers();
    bool isIterating = true;
    for(i; isIterating; isIterating = i.MoveNext())
    {
        Console.Write(i.Current.ToString() + " ");
    }
    // Output: 3 5 8
}
//用于foreach
public IEnumerable SomeNumbers()
{
    yield return 3;
    yield return 5;
    yield return 8;
}

public void Test()
{
    foreach (int number in SomeNumbers())
    {
        Console.Write(number.ToString() + " ");
    }
    // Output: 3 5 8
}
//yield return并非return。
//return用于返回函数第一次调用的返回值
//yield return用于返回每次IEnumerator.Current的返回值
//<expression>可以是任意类型,
//和迭代器函数声明的返回值(IEnumerator/IEnumerable)没半毛钱关系。
yield return <expression>;
//yield break用来中断迭代。
yield break;

Unity的协程机制

public class TestCoroutine : MonoBehaviour
{
    IEnumerator Awake()
    {
        Debug.Log("1");
        yield return new WaitForSeconds(1);
        StartCoroutine(Do());
        Debug.Log("4");
    }
    IEnumerable Start()
    {
        Debug.Log("这行代码压根不会被执行。因为错误地声明为了IEnumerable了。");
    }
    IEnumerator Do()
    {
        Debug.Log("2");
        Debug.Log("2.1");
        yield return StartCoroutine(NewDo());
        Debug.Log("6");
    }
    IEnumerator NewDo()
    {
        Debug.Log("3");
        yield return new WaitForSeconds(2);
        Debug.Log("5");
    }

    /*
    //被Unity频繁调度的消息函数(Update、FixedUpdate和LateUpdate)不能声明为迭代器函数
    //否则Unity编译会报错。(虽然Mono/VS等外部编译器不报错)
    IEnumerator Update()
    {
        yield return new WaitForSeconds(1);
    }
    */
}

//Output: 1 “等了1秒后” 2 2.1 3 4 “等了2秒后” 5 6

上一篇 下一篇

猜你喜欢

热点阅读