跳至主要内容

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 作為宿主啟動協程;適合讓非 MonoBehaviour 的類別執行協程。

UMT.worker.RunCoroutine(this.MyRoutine());

提醒 字串版本依 Unity StartCoroutine(string) 語義,僅能啟動定義於 UMT 自身的方法,一般情況請使用 IEnumerator 版本

CancelCoroutine

public void CancelCoroutine(IEnumerator routine)

public void CancelCoroutine(string methodName)

停止指定的協程 (需傳入與啟動時相同的 IEnumerator 實例或方法名稱)。

CancelAllCoroutines

public void CancelAllCoroutines()

停止所有由 UMT 啟動的協程。

Clear

public void Clear()

清空尚未執行的工作佇列 (已執行的工作不受影響)。