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:在回调/动作中不可访问的变量、对象、方法的主要内容,如果未能解决你的问题,请参考以下文章