跳至主要内容

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()

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