Unity協程實際作用


   最近在學習uinty,用到了協程這個東西。網上查閱了很多資料,介紹的都十分復雜,而且沒有太大價值,不得不說有項目經驗的人果真厲害,幾句話就點醒了我,現在直接解釋。


1. 協程不是多線程!!! 協程還是在主線程里面,這點十分重要,不要被網上其他資料誤導。

2. 協程不是只能做簡單的延遲,雖然你可能用過下面的延遲幾秒的代碼,但是協程的價值在這里完全體現不出來。

 

	void Start()
    {
        StartCoroutine(coRoutine());
    }
    IEnumerator coRoutine()
    {
        yield return new WaitForSeconds(1);
    }


因為其實這種只是暫停幾秒,完全沒必要單獨開一個協程,下面這種方法也可以實現

 

 

IEnumerator Start () {
        
      // StartCoroutine(coRoutine());

        Debug.Log("1");
       yield return new WaitForSeconds(3);
       Debug.Log("2");
         
	}


是不是很意外,start竟然也可以return,當然一般不這么做,這個例子只是為了說明協程不只是用來做延遲的

 


3. 協程的真正用途是分步做一個比較耗時的事情,比如游戲里面的加載資源

 

private int num = 0;
private const  int total=30;

	void Start()
    {
        StartCoroutine(coRoutine());
    }

   IEnumerator coRoutine()
    {
        while (num<total)
        {
            num++;
            Debug.Log(num);
            yield return null;
        }   
    }
	
	void Update () {
        Debug.Log("update!");
	}
    void LateUpdate()
    {
        Debug.Log("lateUpdate!");
    }

 

上面的代碼是個簡單的例子,比如我們加載的資源有30個(total),但是一次加載完畢會耗費大量的時間,不可能讓玩家在start中等待這么久,這時候協程的作用就出現了,協程是每幀lateUpdate之前執行yield return之前的代碼,lateupdate之后執行yield return之后的代碼,相當於每幀循環一次(前提是你的協程有循環體,否則一幀就執行完了),具體可以復制我的代碼看一下日志,這樣就不會卡在這加載30個資源這里,而是你在update里面繼續做你的事情,我每次只加載1個,加載1個耗時顯然遠遠小於30個。


上面的例子具體可以對應進入一張地圖加載NPC,當你進入一張地圖后,如果一次性加載30個NPC,你可能就卡在進地圖的地方,等待這30個NPC全部加載出來之后才能行動,但是用了協程,你可以移動,可能你移動一步(或者幾步),加載一個NPC,實際上你根本感受不到移動過程中有停頓的現象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM