首先,我对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 回答
WebGL不支持
System.Net
名称空间或System.Net.Sockets
中的任何内容,这是出于安全原因Unity的uNET支持WebGL,但它在内部使用WebSockets协议来实现 .
HLAPI:
如果使用NetworkManager,则可以通过将NetworkManager.useWebSockets设置为
true
来启用WebSockets支持 .如果正在使用NetworkServer,则可以通过将NetworkServer.useWebSockets设置为
true
来启用WebSockets支持 .您现在可以使用客户端代码进行连接 .
LLAPI:
NetworkTransport.AddHost
.你也可以用 LLAPI: 听WebGL和普通的Unity protol
不完全确定WebGL是否支持LLAPI . 我不明白为什么它不应该这么试试 . HLAPI支持WebGL上的WebSocket .
这有点旧,但我仍然想更新这个,因为其他人会碰到它 .
看起来您正在客户端尝试NetworkTransport.AddWebSocketHost(),这对WebGL构建不起作用 . WebGL构建不能充当主机...... https://docs.unity3d.com/ScriptReference/Networking.NetworkTransport.AddWebsocketHost.html
您需要在Web客户端上使用NetworkTransport.AddHost() .
我得到它的工作,并向服务器发送消息工作正常,但由于某种原因,我无法从服务器接收消息到客户端 . Web调试器给出了一个错误... SerializationException:意外的二进制元素:0
所以现在我正在追逐这个 . :)