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