文档

支持

Relay

Relay

保持连接活动状态

Prevent connection timeouts by regularly sending messages to the Relay server.
阅读时间2 分钟最后更新于 1 个月前

在客户端处于无活动状态一段时间后,Relay 服务器会自动与客户端断开连接。Relay 断开与客户端连接前的默认生存时间 (TTL) 为 10 秒。主机处于独立状态时(
BIND
消息后,但在对端使用
CONNECT
进行连接之前),断开连接前的 TTL 为 60 秒。Relay 服务器收到的关于客户端(作为发送方或接收方)的任何消息均会引发超时时间重置。
对于消息收发频率较低的游戏,有必要使用通常调用的
Update()
循环等方法,保持连接活动状态。如果搭配 NGO 使用 Relay,Network Manager (
NetworkManager
) 会自动保持连接活动状态。不过,这仅在已成功调用 [
StartClient
](https://docs.unity3d.com/Packages/com.unity.netcode.gameobjects@latest?subfolder=/api/Unity.Netcode.NetworkManager.html#Unity_Netcode_NetworkManager_StartClient%20%E6%88%96%20%5B%60StartHost%60%5D(https://docs.unity3d.com/Packages/com.unity.netcode.gameobjects@latest?subfolder=/api/Unity.Netcode.NetworkManager.html#Unity_Netcode_NetworkManager_StartHost) 之后才能实现。
如果搭配 UTP 使用 Relay,只要对主机玩家和加入玩家的
NetworkDriver
定期计划更新,UTP 就可以自动保持连接活动状态。通常情况下,接受新的连接和接收消息也需要定期计划更新。以下代码示例展示了可保持连接活动状态的代码。
//Call the below regularly, e.g., in Monobehaviour.Update()void Example_KeepingConnectionAlive(){ // Update the NetworkDrivers regularly to ensure the host/player is kept online. if (HostDriver.IsCreated && isRelayServerConnected) { HostDriver.ScheduleUpdate().Complete(); //Accept incoming client connections while (HostDriver.Accept() != default(NetworkConnection)) { Debug.Log("Accepted an incoming connection."); } } if (PlayerDriver.IsCreated && clientConnection.IsCreated) { PlayerDriver.ScheduleUpdate().Complete(); //Resolve event queue NetworkEvent.Type eventType; while ((eventType = clientConnection.PopEvent(PlayerDriver, out _)) != NetworkEvent.Type.Empty) { if (eventType == NetworkEvent.Type.Connect) { Debug.Log("Client connected to the server"); } else if (eventType == NetworkEvent.Type.Disconnect) { Debug.Log("Client got disconnected from server"); clientConnection = default(NetworkConnection); } } }}