using System.Collections.Concurrent; using UnityEngine; using System; public class UnityMainThreadDispatcher : MonoBehaviour { private static UnityMainThreadDispatcher instance; private readonly ConcurrentQueue actionQueue = new ConcurrentQueue(); public static void Initialize() { if (instance == null) { var go = new GameObject("UnityMainThreadDispatcher"); DontDestroyOnLoad(go); instance = go.AddComponent(); } } public static UnityMainThreadDispatcher Instance { get { if (instance == null) { var go = new GameObject("UnityMainThreadDispatcher"); DontDestroyOnLoad(go); instance = go.AddComponent(); } return instance; } } public void Enqueue(Action action) { actionQueue.Enqueue(action); } private void Update() { while (actionQueue.TryDequeue(out var action)) { action(); } } }