问题原因:
解决方法:
解决过程
1、在 Unity 中创建一个名为 MainThreadDispatcher 的脚本,用于处理主线程操作。
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。
using UnityEngine;public class MainThreadDispatcherInitializer : MonoBehaviour
{private void Awake(){DontDestroyOnLoad(this.gameObject);gameObject.AddComponent<MainThreadDispatcher>();}
}
3、在 Unity 中创建一个名为 MainThreadDispatcherInitializer 的空 GameObject,并将 MainThreadDispatcherInitializer 脚本添加到该 GameObject 上。
4、在其他脚本中,可以通过 MainThreadDispatcher.ExecuteOnMainThread 方法将操作推送到主线程执行。
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老师耐心的帮我远程解决问题