首先,我对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()
,但我必须这样做,因为否则它似乎甚至没有尝试建立与权威服务器的连接。
服务器接受TCP上的握手(我不知道为什么会这样,Unity WebGL导出似乎通过TCP进行握手,而标准说它应该通过HTTP完成),并以适当的方式响应握手回应。
当游戏开始时,会调用writeData()
,但无论出于何种原因,该数据都无法到达服务器。控制台中的调试消息说状态为Ok。但是,服务器中没有收到任何消息。
所有这些,缺乏关于该主题的正确文档,关于LLAPI,HLAPI的文档以及如何使用这些库在Unity WebGL导出下启动WebSocket通信的底线归结为一个问题:
使用Unity WebGL导出时,有哪些好的替代库可以建立与支持TCP的权威服务器的连接?
P.S。我看到了WebSocket的一些原生C#框架,比如WebSocket-Sharp,但我担心是否存在任何限制并且在Unity WebGL导出下不起作用?
答案 0 :(得分:1)
WebGL不支持for(Integer number : numbers) { ... }
命名空间或System.Net
中的任何内容,这是出于安全原因
Unity的uNET支持WebGL,但它在内部使用WebSockets协议来实现。
<强> HLAPI:强>
NetworkManager
,您可以启用WebSockets支持
将NetworkManager.useWebSockets
设置为System.Net.Sockets
。NetworkServer
,则可以启用WebSockets支持
将NetworkServer.useWebSockets
设为true
。您现在可以使用客户端代码进行连接。
<强> LLAPI:强>
NetworkTransport.AddWebsocketHost
启用WebSocket。一世
注意到您目前正在使用true
。您还可以使用 LLAPI
收听WebGL和普通Unity protolNetworkTransport.AddHost
不完全确定WebGL是否支持LLAPI。我不明白为什么它不应该试一试。 HLAPI支持WebGL上的WebSocket。
答案 1 :(得分:0)
这有点旧,但我仍然想更新这个,因为其他人会碰到它。
看起来您正在尝试在客户端上使用NetworkTransport.AddWebSocketHost(),这对于WebGL构建不起作用。 WebGL构建不能充当主机...... https://docs.unity3d.com/ScriptReference/Networking.NetworkTransport.AddWebsocketHost.html
您需要在Web客户端上正常使用NetworkTransport.AddHost()。
我让它工作并向服务器发送消息工作正常,但由于某种原因我无法从服务器接收消息到客户端。 Web调试器给出了错误... SerializationException:意外的二进制元素:0
所以现在我正在追逐这个。 :)