using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class UnityMainThreadDispatcher : MonoBehaviour { private static readonly Queue _executionQueue = new Queue(); /// /// Locks the queue and adds the IEnumerator to the queue /// /// IEnumerator function that will be executed from the main thread. public void Enqueue(IEnumerator action) { lock (_executionQueue) { _executionQueue.Enqueue(() => { StartCoroutine(action); }); } } /// /// Locks the queue and adds the Action to the queue /// /// function that will be executed from the main thread. public void Enqueue(Action action) { Enqueue(ActionWrapper(action)); } IEnumerator ActionWrapper(Action a) { a(); yield return null; } private static UnityMainThreadDispatcher _instance = null; public static bool Exists() { return _instance != null; } public static UnityMainThreadDispatcher Instance() { if (!Exists()) { throw new Exception("UnityMainThreadDispatcher could not find the UnityMainThreadDispatcher object. Please ensure you have added the MainThreadExecutor Prefab to your scene."); } return _instance; } void Awake() { if (_instance == null) { _instance = this; DontDestroyOnLoad(this.gameObject); } } public void Update() { lock (_executionQueue) { while (_executionQueue.Count > 0) { _executionQueue.Dequeue().Invoke(); } } } //void OnDestroy() //{ // Debug.Log(79 + "清掉dispatch"); // _instance = null; //} }