【解决】Unity3D中无法在MQTT事件中执行Animator

问题原因:

解决方法:

解决过程

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老师耐心的帮我远程解决问题

相关推荐
SmalBox4 小时前
【节点】[EvaluateRefractionData节点]原理解析与实际应用
unity3d·游戏开发·图形学
_zhourui_h_7 小时前
Unity MyFramework 用法说明(六):使用 FrameSystem 管理全局快捷键
unity3d·游戏开发
_zhourui_h_1 天前
Unity MyFramework 用法说明(五):使用 GameScene 和 SceneProcedure 管理业务流程
unity3d·游戏开发
_zhourui_h_1 天前
Unity MyFramework 用法说明(四):使用 UGUIGenerator 自动生成 UI 代码
unity3d
SmalBox2 天前
【节点】[EvaluateFoamData节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox3 天前
【节点】[ComputeVertexPosition节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox4 天前
【节点】[ScleraUVLocation节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox5 天前
【节点】[ScleraLimbalRing节点]原理解析与实际应用
unity3d·游戏开发·图形学
qiqizizzz6 天前
Unity层级问题 #03 | MeshRender vs UI 组件
unity3d·游戏开发
SmalBox6 天前
【节点】[ScleraIrisBlend节点]原理解析与实际应用
unity3d·游戏开发·图形学