如何使用node-red-contrib-socketio将Node-Red中的事件发送到Unity客户端

时间:2018-03-15 15:15:22

标签: c# unity3d socket.io node-red

我正在尝试使用node-red-contrib-socketio包根据来自Weather Underground的输入从Node-Red向客户端发出'weather'事件。

Emit Weather Event from Node-Red

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

Setting 'weather' event

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库接收事件:https://assetstore.unity.com/packages/tools/network/socket-io-for-unity-21721

Unity正在通过以下网址收听天气事件:

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");
    }

}

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

根据您提供的代码和资产的所有者,它似乎是DEPRECATED SocketIO Unity port,我建议您查看socket.io-unity(这是免费的github和10 $来自资产商店)这是Quobject SocketIoClientDotNet的修订版,可与Unity3D一起使用

我知道这不是一个具体的答案(除了切换库)来修复你的问题,但你的包的所有者已经说了两年多以前他已经停止了它的开发。因此,为什么我认为将库切换为主要选项会很有趣,我实际上认为你做得对,而且它不起作用。我目前正在工作,无法对此进行测试,抱歉。我希望我能以某种方式提供帮助。

答案 1 :(得分:0)

经过进一步的研究和测试,我得到了这个工作。 Node-Red流程很好但是某种配置问题阻止了它的工作。重新安装Node.js和Node-Red解决了这个问题。

根据@hardillb的建议使用msg.socketIOEmit = "emit"

我为Unity测试了几个SocketIO解决方案,并使用SocketIO for Native and WebGL builds by DASPETE结束,这是一个10美元的付费资产。

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

要在Unity WebGL构建中成功使用该程序包,您需要在资产文件夹中添加link.xml file。这会增加默认Unity字节码剥离的例外情况,这会从DLL中删除未使用的代码,如Newtonsoft.Json包。

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