Unity、C#、SocketIO:在回调/动作中不可访问的变量、对象、方法

Posted

技术标签:

【中文标题】Unity、C#、SocketIO:在回调/动作中不可访问的变量、对象、方法【英文标题】:Unity, C#, SocketIO: variables, objects, methods not accessible in callback/action 【发布时间】:2022-01-16 10:12:47 【问题描述】:

正如标题所示,我无法在 socker.io 的回调操作中访问某些变量/对象及其方法。 这是我的代码来说明问题:

using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using SocketIOClient;

public class SimulationManager : MonoBehaviour


    [Header("References")]
    [SerializeField] private GameObject robot;
    private MovementController movement;
    private SensorController sensors;

    [Header("Setup")]
    [SerializeField] private string serverIP;
    [SerializeField] private string serverPort;

    private SocketIO socket;


    // Start is called before the first frame update
    private void Start()
    
        movement = robot.GetComponent<MovementController>();
        sensors = robot.GetComponent<SensorController>();

        InitSockets();
    

    private void InitSockets()
    
        string address = string.Format("http://0:1", serverIP, serverPort);
        socket = new SocketIO(address);

        // standard connection and error events
        socket.OnConnected += (sender, e) => 
            Debug.Log("socket connected");

            // register to server as simulation
            socket.EmitAsync("register", "simulation");
        ;

        socket.OnDisconnected += (sender, e) => Debug.Log("socket disconnected");
        socket.OnError += (sender, e) => Debug.Log("socket error: " + e);
        
        // handle receiving commands
        Action<SocketIOResponse> callback = OnCommandReceived;
        socket.On("command", callback);

        socket.ConnectAsync();
    

    private void OnCommandReceived(SocketIOResponse command)
    
        string type = command.GetValue<string>(0);
        float parameter = float.Parse(command.GetValue<string>(1));

        Debug.Log(string.Format("command received: 0 1", type, parameter));
        movement.Rotate(90f);
    



OnCommandReceived 中,我正在尝试访问之前声明的运动对象并调用它的方法Rotate(...)。该对象似乎不是空的,因为它在尝试访问它时不会在统一控制台中显示任何错误,并且它也不会使游戏崩溃。输出接收到的命令的Debug.Log(...) 工作得很好。将字符串声明为我的类的属性并以这种方式输出也是可能的。只要我将运动或传感器对象介绍给Debug.Log(...),它就不会出现在控制台中,而且正如我之前所说的那样,很奇怪,没有任何错误。

从类的其他上下文中访问所需的变量/方法/属性没有问题。

我也没有忘记在统一编辑器中设置对机器人对象的引用,所以不用担心。这至少也会在控制台中给我一条错误消息。

【问题讨论】:

【参考方案1】:

我现在能够解决问题。问题是

    SocketIO 库捕获了所有发生的异常,但没有在控制台中输出任何内容。我只需要在 try-catch 中包围我的方法调用,看看出了什么问题。 和 unity 不是线程安全的,因此您不能从除主线程之外的任何线程调用方法。

有关如何解决此问题的更多详细信息可以找到in a reddit post here。

【讨论】:

以上是关于Unity、C#、SocketIO:在回调/动作中不可访问的变量、对象、方法的主要内容,如果未能解决你的问题,请参考以下文章

unity动作技能绑定播放

解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

如何在 Unity 中使用 SocketIOClient?

unity c# 代码示例

Unity 改写Dropdown支持多次点击同一选项均回调

socket io 发出失败的回调