關於Unity中協程、多線程、www網絡類的使用
協程
我們要下載一張圖片,加載一個資源,這個時候一定不是一下子就加載好的,或者說我們不一定要等它下載好了才進行其他操作,如果那樣的話我就就卡在了下載圖片那個地方,傻住了。我們希望我們只要一啟動加載的命令,回來的時候主線程能夠繼續進行下去。
我們可以啟動一個協程去下載,主進程依然在運行。有點類似多線程,不同的是,實際上它還是在一個線程裏面,所以我們是在主線程中開啟一段邏輯來進行處理,來協同當前程序的執行,還是在主線程裏面。
1:在主進程中開啟另外一段邏輯處理,來協同當前程序的執行,但與多線程不同都是在主線程裏面執行的,而且原來的進程依然進行下去,
2:通過StartCoroutine方法來啟動一個協程,StartCoroutine是MonoBehaviour的一個方法,該方法可以啟動一個協程,每個協程都有一個入口函數,協程必須要是一個IEnumerator 作為返回值的方法(入口函數);
3:協同程序可以使用yield 關鍵字來中斷協同程序;
4:協程也可以啟動一個協程;
5:WaitForSeconds(): 等待多長時間後中斷協程;
協程實例
1.創建Unity項目和文件目錄,保存場景
2.創建一個空節點game,再創建一個腳本game掛載在gamej節點下
打開game腳本
using System.Collections; using System.Collections.Generic; using UnityEngine; public class game : MonoBehaviour { private int level=3;// Use this for initialization void Start () { //啟動一個協程,必須是繼承自MonoBehaviour才能使用 this.StartCoroutine(this.con_entry()); //主線程依然在執行 //... } //協程和主線程是在同一個線程裏面的,不會有什麽線程切換 //協程的入口函數 IEnumerator con_entry(){ //協程的代碼 Debug.Log("con_entry run!!"); Debug.Log("level:" + this.level);//也能夠拿到this的變量 this.StartCoroutine(this.con_other());//再開啟一個協程con_other //end //使用yield中斷協程程序,就是讓它停下來 yield return null; //協程結束以後的代碼,比如去網上撈一個什麽東西,下載圖片之類的,撈完之後的操作 //end } IEnumerator con_other() { Debug.Log("con_other"); this.StartCoroutine(this.con_entry_params(3));//再開啟一個協程con_entry_params,且傳遞參數 yield return null; } IEnumerator con_entry_params(int a) { Debug.Log("con_entry_params: " + a); yield return new WaitForSeconds(3);//設置3秒中之後才中斷協程 Debug.Log("after WaitForSeconds send");// 處理協程結束的邏輯 } // Update is called once per frame void Update () { } }
多線程
1: using System.Thread;
2: 創建一個線程: Thread r = new Thread(callback); r.start(); 啟動運行線程;
3: 線程回掉函數 void run() {}
4: 多個線程訪問同一個數據的時候,會發生”沖突”,需要線程安全的方式來訪問;
5: 線程鎖是在訪問公共數據的時候,先去獲得這個鎖,沒有獲得鎖的線程將會被掛起,指導這個鎖被釋放。
6: public static Object o = new Object(); lock(o) {線程安全的執行代碼};
7: 線程休眠: Thread.Sleep(單位為ms);
8: 多線程之間要避免死鎖;
關於Unity中協程、多線程、www網絡類的使用