49 lines
1.1 KiB
C#
49 lines
1.1 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public class AdjustThreadDispatcher : MonoBehaviour
|
||
|
{
|
||
|
private static readonly Queue<Action> executionQueue = new Queue<Action>();
|
||
|
private static AdjustThreadDispatcher instance;
|
||
|
|
||
|
public static void RunOnMainThread(Action action)
|
||
|
{
|
||
|
if (action == null)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
lock (executionQueue)
|
||
|
{
|
||
|
executionQueue.Enqueue(action);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
while (executionQueue.Count > 0)
|
||
|
{
|
||
|
Action action;
|
||
|
lock (executionQueue)
|
||
|
{
|
||
|
action = executionQueue.Dequeue();
|
||
|
}
|
||
|
if (action != null)
|
||
|
{
|
||
|
action.Invoke();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
||
|
private static void Initialize()
|
||
|
{
|
||
|
if (instance == null)
|
||
|
{
|
||
|
GameObject obj = new GameObject("AdjustThreadDispatcher");
|
||
|
instance = obj.AddComponent<AdjustThreadDispatcher>();
|
||
|
DontDestroyOnLoad(obj);
|
||
|
}
|
||
|
}
|
||
|
}
|