跳到主要内容

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

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