using UnityEngine;
using System.Collections.Generic;
namespace UnityThreadingUtils
{
///
/// 用于在子线程中将任务安全地调度到Unity主线程执行的工具类
///
public class UnityMainThreadDispatcher : MonoBehaviour
{
private static UnityMainThreadDispatcher _instance;
// 用于存储需要在主线程执行的任务队列
private readonly Queue _actionQueue = new Queue();
private void Awake()
{
if (_instance == null)
{
_instance = this;
// 让这个游戏对象在场景切换时不被销毁,确保持续可用
DontDestroyOnLoad(gameObject);
}
else
{
//Destroy(gameObject);
}
}
///
/// 获取单例实例
///
/// UnityMainThreadDispatcher单例对象
public static UnityMainThreadDispatcher Instance()
{
if (_instance == null)
{
// 创建一个新的游戏对象来挂载该组件
GameObject dispatcherGameObject = new GameObject("UnityMainThreadDispatcher");
_instance = dispatcherGameObject.AddComponent();
// 让这个游戏对象在场景切换时不被销毁,确保持续可用
UnityEngine.Object.DontDestroyOnLoad(dispatcherGameObject);
}
return _instance;
}
///
/// 将一个任务添加到主线程执行的队列中
///
/// 需要在主线程执行的任务(以Action委托表示)
public void Enqueue(System.Action action)
{
lock (_actionQueue)
{
_actionQueue.Enqueue(action);
}
}
private void Update()
{
// 加锁确保线程安全地处理任务队列
lock (_actionQueue)
{
while (_actionQueue.Count > 0)
{
System.Action action = _actionQueue.Dequeue();
try
{
action.Invoke();
}
catch (System.Exception ex)
{
//Debug.LogError($"执行主线程任务时出错: {ex.Message}");
}
}
}
}
}
}