說起多線操作,很多人可能會在第一時間想到Coroutine協程。的確,協程是一種簡單好用的功能,但是除了協程之外,我們也可以使用C#自身的線程來完成一些工作。
在Unity中,使用線程的方法與普通的C#寫法別無二致。例如:
1 public class ThreadTest : MonoBehaviour 2 { 3 void Start() 4 { 5 ThreadStart childRef = new ThreadStart(ThreadTest1); 6 Thread childThread = new Thread(childRef); 7 childThread.Start(); 8 } 9 10 public void ThreadTest1() 11 { 12 print("ThreadTest1 is working"); 13 } 14 }
有一點需要注意,由於MonoBehaviour腳本是會自動實例化的,所以我們不需要通過new方法來生成實例。但是如果不是繼承自MonoBehaviour而僅僅是普通的C#文件,那就還得按照普通的C#的解決方法來添加static或者是new一個實例。
當程序運行時,可以看到線程正常的運行了。如圖:
但是在Unity中使用線程並不是沒有限制的,線程只能進行與Unity無關的工作,例如數據運算等。與Unity引擎相關的操作幾乎都會報錯,例如用線程控制物體移動就是一個無法實現的功能。在Unity中,所有與Unity相關的功能都只能夠在主線程中完成,子線程是無法直接做到的。
例如我嘗試使用線程控制一個GameObject的transform,代碼開發階段是沒有問題的,但是項目在運行后就會立刻報錯。如圖:
從錯誤信息中也可以看出,此類操作只能在主線程中進行。