ルームサーバー接続

ルームサーバーはStrixのマルチプレイヤー機能の主な処理を行うサーバーです。ルームサーバーには個々のルームの情報があり、その中にいるプレイヤーを管理しています。ルームサーバーはまた、ルーム内にいるプレイヤー間のメッセージやイベントを制御し中継します。

ルームへの参加などのルームの機能を利用するためにはルームサーバーへ接続する必要があります。ルームサーバー接続の確立は、明示的な方法で行う(ルームサーバーを検索して接続メソッドを呼び出す)ことも、暗黙のうちに行う(ルーム関連メソッドを直接呼び出す)こともできます。

注釈

ほとんどの場合、ルームサーバーに接続するためのメソッドを明示的に呼び出す必要はありません。CreateRoomJoinRoomといったルームを操作する関数は適切なルームサーバーに(まだ接続されていなければ)自動的に接続するようになっています。

ルームサーバーとの接続を明示的に切断する必要もありません。別のルームサーバーに接続する必要があると、SDKが自動的にルームサーバー接続を切断するからです。

この自動ルームサーバー接続が機能するためには、クライアントがマスターサーバーに接続している(または、以前接続してアイドルタイムアウトによって自動切断された状態である)必要があります。

ルームサーバーの検索

ルームサーバーに明示的に接続するには、そのホスト(IP)アドレスとポート番号を知っている必要があります。これらの情報は、マスターサーバーで検索を行うことで取得できます。

StrixNetwork.instance.SearchRoom(
    limit: 10,
    offset: 0,
    handler: searchResults => {
        Debug.Log(searchResults.roomInfoCollection.Count + " rooms found.");

        foreach (var roomInfo in searchResults.roomInfoCollection)
            Debug.Log("Room ID: " + roomInfo.id
                + "\nHost: " + roomInfo.host
                + "\nPort: " + roomInfo.port
            );
    },
    failureHandler: searchError => Debug.LogError("Search failed. Reason: " + searchError.cause)
);

注釈

SearchRoomメソッドはルームの一覧を返しますが、上の例のように、この一覧からルームサーバーの情報を抽出することができます。ただし次の点に注意してください。

  • リスト内には、同じルームサーバーの情報が複数回見つかることがあります。これは、単一のサーバーに複数のルームが存在することがあるからです。

  • 検索した時点でルームが存在しなかったルームサーバーの情報は取得できません。Strix Unity SDKには、ルームのないルームサーバーの情報を簡単に取得する方法はありません。

ルームサーバーへの接続

ルームサーバー情報を検索した後で、StrixNetworkシングルトンのroomSessionプロパティでConnectメソッドを呼び出すことができます。

StrixNetwork.instance.roomSession.Connect(
    host: roomInfo.host,
    port: roomInfo.port,
    protocol: roomInfo.protocol,
    connectEventHandler: connectResult => Debug.Log("Successfully connected to the room server."),
    errorEventHandler: connectError => Debug.LogError("Connection failed. Reason: " + connectError.cause)
);

他のSDKメソッドと同様に、要求が成功か失敗で終了したときに呼び出されるコールバックを渡すことができます。

既にルームサーバーに接続している場合にConnectを呼び出すと、以前の接続を閉じた後に接続を行います。

注釈

ルームサーバーに接続するためには、ホストアドレスとポート番号に加えて、上の例のようにルームサーバーに接続するためのプロトコルも必要になります。Strixサーバーは複数のトランスポートプロトコルをサポートしているためです。プロトコルはRoomInfoから取得するようにし、ハードコーディングしない方がいいでしょう。

ルームサーバーへ暗黙に接続する

通常は、ルームサーバーに接続するために自分でマスターサーバーに問い合わせる必要はありません。Strixが提供するルームに参加するための関数では、参加するルームのあるルームサーバーに自動的に接続する機能を提供しています。

詳しくはJoinRoomまたはJoinRandomRoomを参照してください。

切断

ルームを使用する必要がなくなったときには、ルームサーバーとの接続を切断することができます。ルーム内にいるときに切断すると、それ以降は同期が行われなくなるとともに、クライアントがルームから退出することになります。

StrixNetwork.instance.roomSession.Disconnect();

注釈

ルームサーバーを手動で切断した後でも、ルームサーバー接続が必要な操作を行うと、StrixNetworkが自動的に同じ(または別の)ルームサーバーに接続することがあります。

状態

IsConnectedフラグを使用して、ルームサーバー接続の状態を確認できます。

bool isConnected = StrixNetwork.instance.roomSession.IsConnected;

クライアントがルームサーバーに接続していれば、このプロパティはtrueを返します。

ルームサーバー接続のタイムアウト

しばらく通信が行われなかった場合、ルームサーバー接続はタイムアウトによって切断されます。マスターサーバー接続とは異なり、ルームサーバータイムアウトでは接続が完全に失われます。プレイヤーがルームに参加していた場合、そのルームから退出することになります。

Strix Unity SDKは、ハートビートメッセージを一定間隔で自動的にルームサーバーに送信するようになっています。デフォルトの設定では、ハートビートの間隔は10秒間、サーバーのタイムアウトは120秒間になっているため、通常の動作中にルームサーバー接続のタイムアウトが発生することはありません。

注釈

ハートビートタイムアウトはサーバー側で設定することができます。ハートビートの時間間隔もSDKで変更することができます(詳しくはSyncTimeClientを参照してください)。これらの値を適切に設定しておかないと、意図せずにルームサーバー接続が切断されてしまうことがありますので、変更する際には注意してください。