跳到主要内容

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

清空尚未执行的工作队列 (已执行的工作不受影响)。