DaoNiaoShu_Dog/Assets/Third/AI/Scripts/TTS&&STT/UnityMainThreadDispatcher.cs

80 lines
2.4 KiB
C#
Raw Normal View History

2025-09-24 19:24:19 +08:00
using UnityEngine;
using System.Collections.Generic;
namespace UnityThreadingUtils
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ص<EFBFBD><D8B5>ȵ<EFBFBD>Unity<74><79><EFBFBD>߳<EFBFBD>ִ<EFBFBD>еĹ<D0B5><C4B9><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public class UnityMainThreadDispatcher : MonoBehaviour
{
private static UnityMainThreadDispatcher _instance;
// <20><><EFBFBD>ڴ洢<DAB4><E6B4A2>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>ִ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private readonly Queue<System.Action> _actionQueue = new Queue<System.Action>();
private void Awake()
{
if (_instance == null)
{
_instance = this;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>٣<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-11-25 17:26:38 +08:00
//DontDestroyOnLoad(gameObject);
2025-09-24 19:24:19 +08:00
}
else
{
//Destroy(gameObject);
}
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <returns>UnityMainThreadDispatcher<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
public static UnityMainThreadDispatcher Instance()
{
if (_instance == null)
{
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
GameObject dispatcherGameObject = new GameObject("UnityMainThreadDispatcher");
_instance = dispatcherGameObject.AddComponent<UnityMainThreadDispatcher>();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>٣<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-11-25 17:26:38 +08:00
//UnityEngine.Object.DontDestroyOnLoad(dispatcherGameObject);
2025-09-24 19:24:19 +08:00
}
return _instance;
}
/// <summary>
/// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>߳<EFBFBD>ִ<EFBFBD>еĶ<D0B5><C4B6><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="action"><3E><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>ִ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Actionί<6E>б<EFBFBD>ʾ<EFBFBD><CABE></param>
public void Enqueue(System.Action action)
{
lock (_actionQueue)
{
_actionQueue.Enqueue(action);
}
}
private void Update()
{
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>̰߳<DFB3>ȫ<EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lock (_actionQueue)
{
while (_actionQueue.Count > 0)
{
System.Action action = _actionQueue.Dequeue();
try
{
action.Invoke();
}
catch (System.Exception ex)
{
//Debug.LogError($"ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>: {ex.Message}");
}
}
}
}
}
}