持続的接続

ノート: Netcode for GameObjects (NGO) は、接続を自動的に維持します。Relay と UTP を使用する を参照してください。

Relay サーバーは、一定時間アクティビティがないクライアントを自動的に 切断 します。Relay がクライアントを切断するまでのデフォルトの生存時間 (TTL、time to live) は、10 秒 です。ホスト単独の場合の切断までの TTL は、60 秒 (BIND メッセージの後かつ CONNECT メッセージとともにピアがそれらに接続される前) です。このクライアントに関連して Relay サーバーが受信した (送信者または受信者としての) メッセージがある場合、この タイムアウト はリセットされます。

メッセージの頻度が低いゲームの場合は、定期的に呼び出すメソッドで接続を維持することが重要です。たとえば、Update() ループ内で呼び出すなどです。NGO を使用した Relay を使用している場合は、ネットワークマネージャー (NetworkManager) によって接続が自動的に維持されます。ただし、これは StartClient または 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);
            }
        }
    }
}