UNITY 3D 协程执行顺序

一,
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class TestCoroutine : MonoBehaviour {  
  5.   
  6.     private bool isStartCall = false;  //Makesure Update() and LateUpdate() Log only once  
  7.     private bool isUpdateCall = false;  
  8.     private bool isLateUpdateCall = false;  
  9.     // Use this for initialization  
  10.     void Start () {  
  11.         if (!isStartCall)  
  12.         {  
  13.             Debug.Log("Start Call Begin");  
  14.             StartCoroutine(StartCoutine());  
  15.             Debug.Log("Start Call End");  
  16.             isStartCall = true;  
  17.         }  
  18.       
  19.     }  
  20.     IEnumerator StartCoutine()  
  21.     {  
  22.           
  23.         Debug.Log("This is Start Coroutine Call Before");  
  24.         yield return new WaitForSeconds(1f);  
  25.         Debug.Log("This is Start Coroutine Call After");  
  26.              
  27.     }  
  28.     // Update is called once per frame  
  29.     void Update () {  
  30.         if (!isUpdateCall)  
  31.         {  
  32.             Debug.Log("Update Call Begin");  
  33.             StartCoroutine(UpdateCoutine());  
  34.             Debug.Log("Update Call End");  
  35.             isUpdateCall = true;  
  36.         }  
  37.     }  
  38.     IEnumerator UpdateCoutine()  
  39.     {  
  40.         Debug.Log("This is Update Coroutine Call Before");  
  41.         yield return new WaitForSeconds(1f);  
  42.         Debug.Log("This is Update Coroutine Call After");  
  43.     }  
  44.     void LateUpdate()  
  45.     {  
  46.         if (!isLateUpdateCall)  
  47.         {  
  48.             Debug.Log("LateUpdate Call Begin");  
  49.             StartCoroutine(LateCoutine());  
  50.             Debug.Log("LateUpdate Call End");  
  51.             isLateUpdateCall = true;  
  52.         }  
  53.     }  
  54.     IEnumerator LateCoutine()  
  55.     {  
  56.         Debug.Log("This is Late Coroutine Call Before");  
  57.         yield return new WaitForSeconds(1f);  
  58.         Debug.Log("This is Late Coroutine Call After");  
  59.     }  
  60. }  

 得到日志输入结果如下:
技术分享


二,

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class TestCoroutine : MonoBehaviour {  
  5.   
  6.     private bool isStartCall = false;  //Makesure Update() and LateUpdate() Log only once  
  7.     private bool isUpdateCall = false;  
  8.     private bool isLateUpdateCall = false;  
  9.     // Use this for initialization  
  10.     void Start () {  
  11.         if (!isStartCall)  
  12.         {  
  13.             Debug.Log("Start Call Begin");  
  14.             StartCoroutine(StartCoutine());  
  15.             Debug.Log("Start Call End");  
  16.             isStartCall = true;  
  17.         }  
  18.       
  19.     }  
  20.     IEnumerator StartCoutine()  
  21.     {  
  22.           
  23.         Debug.Log("This is Start Coroutine Call Before");  
  24.         yield return new WaitForSeconds(1f);  
  25.         Debug.Log("This is Start Coroutine Call After");  
  26.              
  27.     }  
  28.     // Update is called once per frame  
  29.     void Update () {  
  30.         if (!isUpdateCall)  
  31.         {  
  32.             Debug.Log("Update Call Begin");  
  33.             StartCoroutine(UpdateCoutine());  
  34.             Debug.Log("Update Call End");  
  35.             isUpdateCall = true;  
  36.             this.enabled = false;  
  37.             //this.gameObject.SetActive(false);  
  38.         }  
  39.     }  
  40.     IEnumerator UpdateCoutine()  
  41.     {  
  42.         Debug.Log("This is Update Coroutine Call Before");  
  43.         yield return new WaitForSeconds(1f);  
  44.         Debug.Log("This is Update Coroutine Call After");  
  45.         yield return new WaitForSeconds(1f);  
  46.         Debug.Log("This is Update Coroutine Call Second");  
  47.     }  
  48.     void LateUpdate()  
  49.     {  
  50.         if (!isLateUpdateCall)  
  51.         {  
  52.             Debug.Log("LateUpdate Call Begin");  
  53.             StartCoroutine(LateCoutine());  
  54.             Debug.Log("LateUpdate Call End");  
  55.             isLateUpdateCall = true;  
  56.   
  57.         }  
  58.     }  
  59.     IEnumerator LateCoutine()  
  60.     {  
  61.         Debug.Log("This is Late Coroutine Call Before");  
  62.         yield return null;  
  63.         Debug.Log("This is Late Coroutine Call After");  
  64.     }  
  65. }  

 先在Update中调用 this.enabled = false; 得到的结果:
技术分享
然后把 this.enabled = false; 注释掉,换成 this.gameObject.SetActive(false); 得到的结果如下:
技术分享
       整理得到:通过设置MonoBehaviour脚本的enabled对协程是没有影响的,但如果 gameObject.SetActive(false) 则已经启动的协程则完全停止了,即使在Inspector把gameObject 激活还是没有继续执行。也就说协程虽然是在MonoBehvaviour启动的(StartCoroutine)但是协程函数的地位完全是跟MonoBehaviour是一个层次的,不受MonoBehaviour的状态影响,但跟MonoBehaviour脚本一样受gameObject 控制,也应该是和MonoBehaviour脚本一样每帧“轮询” yield 的条件是否满足。


你可能感兴趣的:(学习笔记,unity,Unity,3D)