

1、在 Unity 中创建一个名为 MainThreadDispatcher 的脚本,用于处理主线程操作。
- using System.Collections.Generic;
- using UnityEngine;
-
- public class MainThreadDispatcher : MonoBehaviour
- {
- private static MainThreadDispatcher instance;
- private static readonly Queue
actionQueue = new Queue(); -
- 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
(); - }
- }
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老师耐心的帮我远程解决问题