Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Node Red contrib socketio将事件从Node Red发送到Unity客户端_C#_Unity3d_Socket.io_Node Red - Fatal编程技术网

C# 如何使用Node Red contrib socketio将事件从Node Red发送到Unity客户端

C# 如何使用Node Red contrib socketio将事件从Node Red发送到Unity客户端,c#,unity3d,socket.io,node-red,C#,Unity3d,Socket.io,Node Red,我正试图使用node red contrib socketio包,根据weather Underground的输入,从node red向客户端发出“weather”事件 我在节点red函数中使用以下代码来处理WeatherUnderground的输入并设置事件: weather = msg.payload.weather; msg.payload = {weather: weather}; msg.socketIOEvent = 'weather'; RED.util.setMessagePr

我正试图使用node red contrib socketio包,根据weather Underground的输入,从node red向客户端发出“weather”事件

我在节点red函数中使用以下代码来处理WeatherUnderground的输入并设置事件:

weather = msg.payload.weather;
msg.payload = {weather: weather};
msg.socketIOEvent = 'weather';
RED.util.setMessageProperty(msg, "socketIOEmit", "emit", true);
return msg;

这是设置和发出天气事件的正确方法吗

供参考:

我已经将SocketIO Out节点绑定到node_Red(因此可能是本地主机上的端口1880)。我使用Unity游戏引擎作为客户端,从资产存储区接收带有Socket.IO库的事件:

Unity正在以下URL上收听天气事件:

ws://127.0.0.1:1880/socket.io/?EIO=4&transport=websocket
目前Unity似乎正在记录连接,但没有记录发射的天气事件

我在Unity中处理事件的测试C#脚本如下:

using UnityEngine;
using SocketIO;

public class NodeNetwork : MonoBehaviour
{

    //Reference socket component
    static SocketIOComponent socket;

    void Start()
    {
        //Initialise reference to socket component
        socket = GetComponent<SocketIOComponent>();
        //Register callbacks for network events
        socket.On("open", OnConnected);
        socket.On("weather", OnWeather);
    }

    //Create a callback for the connection
    void OnConnected(SocketIOEvent e)
    {
        Debug.Log("Connected");
        //Emit a move call back to the server 
        socket.Emit("client connected");
    }

    //Create a callback for receipt of weather events
    void OnWeather(SocketIOEvent e)
    {
        Debug.Log("New weather event received" + e.data);
        socket.Emit("weather received");
    }

}
使用UnityEngine;
使用SocketIO;
公共类节点网络:单一行为
{
//参考插座组件
静态插座组件插座;
void Start()
{
//初始化对插座组件的引用
socket=GetComponent();
//注册网络事件的回调
插座打开(“打开”,未连接);
插座。On(“天气”,On天气);
}
//为连接创建回调
未连接的空隙(承插孔e)
{
Debug.Log(“已连接”);
//向服务器发出移动回调
socket.Emit(“客户端连接”);
}
//创建用于接收天气事件的回调
void OnWeather(SocketIOEvent e)
{
调试日志(“收到新天气事件”+e.data);
插座。发射(“天气接收”);
}
}

任何建议都将不胜感激。

根据您提供的代码和资产所有者,我建议您研究一下(github免费提供,资产商店提供10美元),这是Quobject的修订版,可与Unity3D合作


我知道这不是解决您的问题的具体答案(除了切换库),但您的软件包的所有者在2年前曾表示,他已经停止了开发。因此,我认为将库作为主要选项是很有趣的,我实际上认为您做得对,但它不起作用。我目前正在工作,无法测试,抱歉。我希望我能在某种程度上提供帮助。

经过进一步的研究和测试,我使这项工作得以开展。节点红色流程正常,但某种配置问题使其无法工作。重新安装Node.js和Node Red解决了该问题

使用@hardillb works建议的
msg.socketIOEmit=“emit”

我测试了几个针对Unity的SocketIO解决方案,并最终使用了一个10美元的付费资产

为了反序列化JSON,我使用了SaladLab,它是NewtonSoft.JSON.NET的一个分支

要在Unity WebGL构建中成功使用该软件包,您需要向资产文件夹中添加一个。这将为默认的Unity字节码剥离添加异常,该剥离将从DLL(如Newtonsoft.Json包)中删除未使用的代码


我希望如果您有同样的问题,这会有所帮助。

很可能是
socket.On(“weather”,OnWeather)在正确建立连接之前未触发?如果从何处获取功能节点中的代码?不需要使用
RED.util.setMessageProperty()
它可以替换为
msg.socketIOEmit=“emit”@hardillb该代码源自为节点提供的示例聊天应用程序。那条线实际上给我造成了错误,但我试图弄清楚它在做什么,但我试着用它。我把它扔了,看看我能到哪里去。感谢您的反馈。您好,我尝试按照建议将
RED.util.setMessageProperty()
替换为
msg.socketIOEmit=“emit”
。这对调试器中的输出具有相同的效果。无论哪种方式,我都会得到错误
“TypeError:无法读取未定义的”
的属性“broadcast”。完全删除该行允许我成功地将有效负载发送到Unity(节点上的默认设置是向所有人广播)。但是,这使我无法确定如何将节点红色中的emit属性设置为以客户机为目标,而不是向所有用户广播。谢谢,谢谢你的建议。我在Node.js中使用的资产对我来说仍然可以正常工作,但迁移到受支持的库可能是一个不错的选择。希望它也能用于WebGL构建。您好@Antry,我想您可能想知道socket.io-unity目前存在一系列问题,如下所述:我与unity后处理堆栈有冲突。要尝试另一种解决方案。@VirtualArchitectures Ay,太糟糕了,希望他们能解决这个问题,你找到任何解决方法或替代方案了吗?嘿@Antry,谢谢你的跟进。显然,您可以通过编辑源代码和重新构建来解决floatinghotpot资产的问题。为了快速解决问题,我选择使用@VirtualArchitectures是的,他应该能够在声明中编辑或指定使用的名称空间,这样就不会有任何问题了,idk为什么他没有这样做。恭喜你的解决方案,可惜它是一个专有/付费的解决方案。我希望你达到你的目标。