using System.Collections.Concurrent; using System.Threading.Tasks; 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); } public Task EnqueueAsync(Action action) { var tcs = new TaskCompletionSource(); actionQueue.Enqueue(() => { try { action(); tcs.SetResult(true); } catch (Exception e) { tcs.SetException(e); } }); return tcs.Task; } private void Update() { while (actionQueue.TryDequeue(out var action)) { action(); } } }