通过yield return 嵌套,子协程执行完之后父进程才继续执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Collections;
using UnityEngine;

public class test2 : MonoBehaviour {


void Start () {
Debug.Log("Start0");
StartCoroutine(test());
Debug.Log("Start1");
}

IEnumerator test()
{

Debug.Log("test0");
yield return StartCoroutine(testzz());
Debug.Log("test1");

}
IEnumerator testzz()
{
for (int i = 0; i < 5; i++)
{
Debug.Log("test2222");
yield return null;
}


}
}

运行顺序

不使用Yield Return,父协程会先执行完毕

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Collections;
using UnityEngine;

public class test2 : MonoBehaviour {


void Start () {
Debug.Log("Start0");
StartCoroutine(test());
Debug.Log("Start1");
}

IEnumerator test()
{

Debug.Log("test0");
StartCoroutine(testzz());
Debug.Log("test1");
yield return null;

}
IEnumerator testzz()
{
for (int i = 0; i < 5; i++)
{
Debug.Log("test2222");
yield return null;
}
}
}

执行顺序

Coroutine会在调用时直接先运行一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System.Collection;
using UnityEngine;

public class CoroutineTest : MonoBehaviour
{
Coroutine m_Coroutine;
private void OnGUI()
{
if(GUILayout.Button("Start1"))
m_Coroutine = StartCoroutine(MyTestCo());
if(GUILayout.Button("Start2"))
m_Coroutine = StartCoroutine(MyTestCo2());
}

IEnumerator MyTestCo()
{
for(int i = 0;i < 3; i++)
{
Debug.Log("fff");
yield return null;
}
}
IEnumerator MyTestCo2()
{
StopCoroutine(m_Coroutine);//在调用的当时,m_Coroutine指的是MyTestCo,所以这一句是合理的
for(int i = 0;i < 3; i++)
{
Debug.Log("eee");
yield return null;
}
}
}

在Coroutine内调用Time.deltatime和WaitForScends是受Timescale控制的

使用coroutine计时是可以暂停游戏的。