using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Viveport { public class MainThreadDispatcher : MonoBehaviour { private static readonly Queue actions = new Queue(); private static MainThreadDispatcher instance = null; private void Awake() { UnityEngine.Object.DestroyImmediate(base.gameObject); } public void Update() { lock (actions) { while (actions.Count > 0) { actions.Dequeue()(); } } } public static MainThreadDispatcher Instance() { if (instance == null) { throw new Exception("Could not find the MainThreadDispatcher GameObject. Please ensure you have added this script to an empty GameObject in your scene."); } return instance; } private void OnDestroy() { if (instance == this) { instance = null; } } public void Enqueue(IEnumerator action) { lock (actions) { actions.Enqueue(delegate { StartCoroutine(action); }); } } public void Enqueue(Action action) { Enqueue(ActionWrapper(action)); } public void Enqueue(Action action, T1 param1) { Enqueue(ActionWrapper(action, param1)); } public void Enqueue(Action action, T1 param1, T2 param2) { Enqueue(ActionWrapper(action, param1, param2)); } public void Enqueue(Action action, T1 param1, T2 param2, T3 param3) { Enqueue(ActionWrapper(action, param1, param2, param3)); } public void Enqueue(Action action, T1 param1, T2 param2, T3 param3, T4 param4) { Enqueue(ActionWrapper(action, param1, param2, param3, param4)); } private IEnumerator ActionWrapper(Action action) { action(); yield return null; } private IEnumerator ActionWrapper(Action action, T1 param1) { action(param1); yield return null; } private IEnumerator ActionWrapper(Action action, T1 param1, T2 param2) { action(param1, param2); yield return null; } private IEnumerator ActionWrapper(Action action, T1 param1, T2 param2, T3 param3) { action(param1, param2, param3); yield return null; } private IEnumerator ActionWrapper(Action action, T1 param1, T2 param2, T3 param3, T4 param4) { action(param1, param2, param3, param4); yield return null; } } }