首页 文章

Unity WebGL websocket LLAPI替代品?

提问于
浏览
-1

首先,我对Unity WebGL导出中的HLAPI,LLAPI和WebSocket支持深感困惑 . HLAPI和LLAPI在UDP上工作,而WebSocket是基于TCP的,HLAPI和LLAPI声称支持它?不确定如何感受到这一点 .

我有一个用Java编写的权威服务器 . 它接受TCP连接 . 我用System.Net.Sockets编写了Unity客户端 . 在编辑器和移动导出中它工作正常,但当我尝试导出WebGL时,我发现它不起作用 .

因为我不想让服务器支持两个协议(UDP和TCP),但统一它只使用TCP,我决定保留我到目前为止在客户端做的事情并将其用于移动导出,并写与WebGL导出不同的逻辑 .

不幸的是,所有UNET谈论的是如何创建客户端主机和其他客户端客户端来连接它,但它并不是说如何使用UNET通过WebSocket连接到权威服务器 .

这是我尝试过的,目前所做的只是启动握手:

override protected void initializeInternal ()
{
    NetworkTransport.Init();

    ConnectionConfig serverConfig = new ConnectionConfig ();
    serverConfig.MaxCombinedReliableMessageCount = 1;
    serverConfig.MaxCombinedReliableMessageSize = 1;
    serverConfig.SendDelay = 0;
    serverConfig.WebSocketReceiveBufferMaxSize = commandByteArraySize;
    channelId = serverConfig.AddChannel(QosType.ReliableSequenced);
    HostTopology topology = new HostTopology(serverConfig, 1);

    hostId = NetworkTransport.AddHost (topology, port);

    Connect ();
}

public void Connect() {
    byte error;
    connectionId = NetworkTransport.Connect(hostId, host, port, 0, out error);
    Debug.Log("Connect host: " + host + "; port: " + port + "; error: " + (NetworkError) error);
}

override protected void writeData(byte[] data) {
    byte error;
    NetworkTransport.Send(hostId, connectionId, channelId, data, data.Length, out error);
    Debug.Log("Send host: " + host + "; port: " + port + "; error: " + (NetworkError) error);
}

我不想 AddHost() ,但我不得不,因为否则它似乎甚至没有尝试 Build 与权威服务器的连接 .

服务器接受TCP上的握手(我不知道为什么会这样,Unity WebGL导出似乎通过TCP进行握手,而标准说它应该通过HTTP完成),并通过正确的握手响应进行响应 .

游戏开始时,会调用 writeData() ,但无论出于何种原因,该数据都无法到达服务器 . 控制台中的调试消息说状态为Ok . 但是,服务器中没有收到任何消息 .

所有这些,缺乏关于该主题的正确文档,关于LLAPI,HLAPI的文档以及如何使用这些库在Unity WebGL导出下启动WebSocket通信的底线归结为一个问题:

使用Unity WebGL导出时,有哪些好的替代库可以与支持TCP的权威服务器 Build 连接?

附:我看到了WebSocket的一些原生C#框架,比如WebSocket-Sharp,但我担心是否有任何限制并且在Unity WebGL导出下不起作用?

2 回答

  • 1

    WebGL不支持 System.Net 名称空间或 System.Net.Sockets 中的任何内容,这是出于安全原因

    Unity的uNET支持WebGL,但它在内部使用WebSockets协议来实现 .

    HLAPI:

    您现在可以使用客户端代码进行连接 .

    LLAPI:

    你也可以用 LLAPI: 听WebGL和普通的Unity protol

    NetworkTransport.AddWebsocketHost(topology, 8887, null);
    NetworkTransport.AddHost(topology, 8888);
    

    不完全确定WebGL是否支持LLAPI . 我不明白为什么它不应该这么试试 . HLAPI支持WebGL上的WebSocket .

  • 0

    这有点旧,但我仍然想更新这个,因为其他人会碰到它 .

    看起来您正在客户端尝试NetworkTransport.AddWebSocketHost(),这对WebGL构建不起作用 . WebGL构建不能充当主机...... https://docs.unity3d.com/ScriptReference/Networking.NetworkTransport.AddWebsocketHost.html

    您需要在Web客户端上使用NetworkTransport.AddHost() .

    我得到它的工作,并向服务器发送消息工作正常,但由于某种原因,我无法从服务器接收消息到客户端 . Web调试器给出了一个错误... SerializationException:意外的二进制元素:0

    所以现在我正在追逐这个 . :)

相关问题