前言:
之前講過的排程系統(tǒng)是做出個大綱了啦....不過Unity 不支援多線程,所以只能用debug畫面示意,且東西也沒太大用處。(Unity 連 UI的text屬性都不給多線程方法取用

)
Demo
說明:
我預(yù)設(shè)3種任務(wù): Idle, Move , Dash,其中Idle優(yōu)先度最低,Move次中,Dash最高且可以斷別人。 這3個任務(wù)都持續(xù)1秒。按A會產(chǎn)生Idle,按S會產(chǎn)生Move,按D會產(chǎn)生Dash任務(wù)給工具。
方法都很單純:
(這些方法原本是要由其他腳本傳入,讓工具做排程,所以沒設(shè)成async。)
其他的方法在github。
停止 Async task
不知道是不是哪裡出錯,若不加await就無法接收到token回傳的終止訊息(如下圖第二行就無法接收)。
啟動方法
執(zhí)行到 var result那行後會等待ProcessActionQueue方法回傳後才繼續(xù)執(zhí)行下面的,所以可以用回傳的值去了解方法是以什麼方式結(jié)束的。
對於token的用法教學(xué),我是看:
簡單的理解是,當(dāng)token呼叫 Cancel()時,會傳訊息到token.IsCancellationRequested。所以在迴圈裡面用判斷式去抓取消的訊號即可。
其他隨手筆記:
async void無法使用await
如下圖,只有第一行Task.Run才能啟動async void。
讀完
這篇,裡面大致的內(nèi)容是說async void方法只適合用在UI按鈕等操作, 若用async void方法去跑些背景程式,且背景程式被中斷時,中斷的exception因為沒task等容器去裝,所以會直接丟到最上層,使整個app crash掉,且無法回復(fù)原本的行程。 若用async task方法,中斷時產(chǎn)生的exception會丟給task,我們可以掌控,並對他做後續(xù)處理。
CancellationTokenSource使用過Cancel()後要再new一次才能使用。
Action型態(tài)傳入的方法變數(shù)被當(dāng)成回傳void方法(?),所以一樣不能用await。

最後,我可能還是要改回去研究用corotuine做,雖然Unity有搞個job system,也有提供不錯的教學(xué)影片,但這感覺會讓專案多出不必要的複雜度。 各有長短吧!

???