83 lines
1.9 KiB
C#
83 lines
1.9 KiB
C#
|
|
using UnityEngine;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System;
|
|||
|
|
|
|||
|
|
|
|||
|
|
public class UnityMainThreadDispatcher : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
private static readonly Queue<Action> _executionQueue = new Queue<Action>();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Locks the queue and adds the IEnumerator to the queue
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="action">IEnumerator function that will be executed from the main thread.</param>
|
|||
|
|
public void Enqueue(IEnumerator action)
|
|||
|
|
{
|
|||
|
|
lock (_executionQueue)
|
|||
|
|
{
|
|||
|
|
_executionQueue.Enqueue(() => {
|
|||
|
|
StartCoroutine(action);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Locks the queue and adds the Action to the queue
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="action">function that will be executed from the main thread.</param>
|
|||
|
|
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;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
}
|