问题原因:
解决方法:
解决过程
1、在 Unity 中创建一个名为 MainThreadDispatcher 的脚本,用于处理主线程操作。
cs
using System.Collections.Generic;
using UnityEngine;
public class MainThreadDispatcher : MonoBehaviour
{
private static MainThreadDispatcher instance;
private static readonly Queue<System.Action> actionQueue = new Queue<System.Action>();
private void Awake()
{
instance = this;
}
private void Update()
{
lock (actionQueue)
{
while (actionQueue.Count > 0)
{
System.Action action = actionQueue.Dequeue();
action.Invoke();
}
}
}
public static void ExecuteOnMainThread(System.Action action)
{
lock (actionQueue)
{
actionQueue.Enqueue(action);
}
}
}
2、在 Unity 中创建一个名为 MainThreadDispatcherInitializer 的脚本,用于初始化 MainThreadDispatcher。
cs
using UnityEngine;
public class MainThreadDispatcherInitializer : MonoBehaviour
{
private void Awake()
{
DontDestroyOnLoad(this.gameObject);
gameObject.AddComponent<MainThreadDispatcher>();
}
}
3、在 Unity 中创建一个名为 MainThreadDispatcherInitializer 的空 GameObject,并将 MainThreadDispatcherInitializer 脚本添加到该 GameObject 上。
4、在其他脚本中,可以通过 MainThreadDispatcher.ExecuteOnMainThread 方法将操作推送到主线程执行。
cs
public class ExampleScript : MonoBehaviour
{
private void Start()
{
// 在其他线程中执行操作
System.Threading.Thread thread = new System.Threading.Thread(() =>
{
// 模拟耗时操作
System.Threading.Thread.Sleep(2000);
// 在主线程中执行操作
MainThreadDispatcher.ExecuteOnMainThread(() =>
{
// 执行动画操作
Debug.Log("操作在主线程中执行");
});
});
thread.Start();
}
}
在这也感谢siki学院的Sk-Sky老师耐心的帮我远程解决问题