保持连接活动状态

注意:Netcode for GameObjects (NGO) 会自动保持连接活动状态。请参阅搭配 NGO 使用 Relay

在客户端处于无活动状态一段时间后,Relay 服务器会自动与客户端断开连接。Relay 断开与客户端连接前的默认生存时间 (TTL) 为 10 秒。主机处于独立状态时(BIND 消息后,但在对端使用 CONNECT 进行连接之前),断开连接前的 TTL 为 60 秒。Relay 服务器收到的关于客户端(作为发送方或接收方)的任何消息均会引发超时时间重置。

对于消息收发频率较低的游戏,有必要使用通常调用的 Update() 循环等方法,保持连接活动状态。如果搭配 NGO 使用 Relay,Network Manager (NetworkManager) 会自动保持连接活动状态。不过,这仅在已成功调用 StartClientStartHost 之后才能实现。

如果搭配 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);
            }
        }
    }
}