前言:
想做個排程工具,不是那種"系統排程"工具,而是給遊戲怪物AI用的。最近在搞怪物AI,隨著動作越來越多,若每個動作都分開判斷執行,這樣加一堆鎖也不夠,再來是Unity 2D animator也很奇怪,在3D上的smooth轉換是很漂亮,但2D完全就變成個累贅,動畫都沒播完就轉換下一個
。
C# 的Task又是另一個世界,但因為一下接觸太多新資訊,所以開個創作邊學邊紀錄自己蠢蠢的實驗。
Async 和 Unity Coroutine的差別:
- Async是C#的東西,生命週期要自己控制。 Coroutine是Unity的東西,生命週期綁在MonoBehavior上,若在Coroutine結束前刪掉啟動它的MonoBehavior物件會報錯,所以重要的Coroutine我會用單例物件去啟動。
- Async不用Unity引擎也能存在。 (如下圖所示,遊戲都沒在play了,沒收掉的Async還是會跑)
- 根據這串討論,Coroutine適合以frame為基準執行的動作(例如移動),Async適合用在工作排程。
- 來源影片
- Async沒管控好會造成memery leaks,而且線程很珍貴,用太多很浪費,可用yield舒緩。 Coroutine則比較沒有記憶體的問題。
Action 和 Task
這著這個參考做,不知道為什麼第17、18行不會執行,只有第19行會。
結果:
但若是在裡面用await Task.Run卻又會執行:
另外
這篇文章有比較 Func , Action 和 Task。
結果:
值得注意的是,taskWhenAll並沒有等DoLog()裡面的1秒,只有等Task3的3秒。
參考文章(裡面有比較whenAll和waitAll,結論是whenAll執行時間比較短)。
還有另外一個是whenAny,傳入的任一task完成即可。
弄成陣列是一樣的效果
題外話,若這樣打:
會出現這個error:
我計概沒讀很好,大概的理解是DoSth是Task.Run的時候分出去的thread吧。
前置概念大概這樣吧,我再研究研究,也許最近都會是這種主題的東西