UMT
Coding Style wiki
UMT (Unity Main Thread) 是 Unity 主執行緒調度器 (MonoBehaviour 懶漢式單例),可將任意執行緒的工作 (Action) 排入佇列,於 Unity 主執行緒的 Update 中依序執行 (排入操作具執行緒鎖),並支援協程的啟動與停止管理。
| 命名空間 | OxGKit.Utilities.UnityMainThread |
| 類型 | public class UMT : MonoBehaviour |
| 原始碼 | UMT.cs |
using OxGKit.Utilities.UnityMainThread;
注意 首次存取 UMT.worker 時,會自動建立名為 [UMT] 的常駐物件 (掛入 OxGKit 容器並 DontDestroyOnLoad);請避免於應用程式關閉/銷毀流程中首次觸發,以免產生多餘物件。
快速上手
using OxGKit.Utilities.UnityMainThread;
using System.Threading.Tasks;
using UnityEngine;
public class UMTDemo : MonoBehaviour
{
private void Start()
{
Task.Run(() =>
{
// 於背景執行緒完成運算後...
var result = 1 + 1;
// 將需要操作 Unity API 的工作排回主執行緒
UMT.worker.AddJob(() =>
{
Debug.Log($"Result: {result} (main thread)");
this.transform.position = Vector3.zero;
});
});
}
}
通用規則
執行時機
- 透過 AddJob 排入的工作,會於 UMT 的
Update中依序全部執行 (FIFO)。 AddJob具執行緒鎖,可於任意執行緒安全呼叫;協程相關方法仍需於主執行緒使用。
成員
| 成員 | 說明 |
|---|---|
public static UMT worker | 取得 UMT 單例 (首次存取自動建立常駐物件)。 |
方法總覽
| 方法 | 說明 |
|---|---|
| AddJob | 將工作排入佇列,於主執行緒的 Update 中執行。 |
| RunCoroutine | 啟動協程 (IEnumerator 或方法名稱)。 |
| CancelCoroutine | 停止協程 (IEnumerator 或方法名稱)。 |
| CancelAllCoroutines | 停止所有由 UMT 啟動的協程。 |
| Clear | 清空尚未執行的工作佇列。 |
AddJob
public void AddJob(Action newJob)
將工作排入佇列,於主執行緒的 Update 中依序執行;可於任意執行緒呼叫 (具執行緒鎖)。
UMT.worker.AddJob(() =>
{
// Do main thread job
});
RunCoroutine
public void RunCoroutine(IEnumerator routine)
public void RunCoroutine(string methodName)
以 UMT 作為宿主啟動協程