FM/Assets/Scripts/FUJIFILM/Other/Aliyun/UnityMainThreadDispatcher.cs

52 lines
1.4 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using UnityEngine;
public class UnityMainThreadDispatcher : MonoBehaviour
{
private static UnityMainThreadDispatcher _instance;
private readonly Queue<Action> _actionQueue = new Queue<Action>();
// 获取单例实例
public static UnityMainThreadDispatcher Instance
{
get
{
if (_instance == null)
{
// 查找现有实例
_instance = FindObjectOfType<UnityMainThreadDispatcher>();
// 如果没有实例则创建一个
if (_instance == null)
{
GameObject obj = new GameObject("UnityMainThreadDispatcher");
_instance = obj.AddComponent<UnityMainThreadDispatcher>();
DontDestroyOnLoad(obj); // 跨场景保留
}
}
return _instance;
}
}
private void Update()
{
// 每帧执行队列中的所有回调(在主线程)
lock (_actionQueue)
{
while (_actionQueue.Count > 0)
{
_actionQueue.Dequeue().Invoke();
}
}
}
// 将行动添加到主线程执行队列
public void Enqueue(Action action)
{
lock (_actionQueue)
{
_actionQueue.Enqueue(action);
}
}
}