通过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); for(int i = 0;i < 3; i++) { Debug.Log("eee"); yield return null; } } }
|
在Coroutine内调用Time.deltatime和WaitForScends是受Timescale控制的
使用coroutine计时是可以暂停游戏的。