NetworkConnection は、ネットワーク接続をカプセル化した HLAPI クラスです。NetworkClient オブジェクトは NetworkConnection をひとつ持ち、NetworkServer は複数の接続(各クライアントからひとつずつ)を持ちます。NetworkConnection はバイト配列か、シリアライズされたオブジェクトをネットワークメッセージとして送信する機能を持っています。
| プロパティー | 機能 | |
|---|---|---|
| hostId | 接続のための ネットワークトランスポートホストID | |
| connectionId | 接続のための ネットワークトランスポートコネクションID | |
| isReady | 通信ができる状態かどうかを制御するためのフラグ | |
| lastMessageTime | この接続で最後にメッセージを受信した時刻 | |
| address | 接続先のエンドポイントの IP アドレス | |
| playerControllers | AddPlayer() によって加えられた一連のプレイヤー | |
| clientOwnedObjects | この接続が権限を持つ一連のオブジェクト | |
NetworkConnection クラスは、トランスポート層にデータの送受信を行う virtual 関数を持っています。これらの関数は、シリアライズされた NetworkConnection のバージョンを調べたり、データを編集したり、異なるソース元を一緒に扱うときに利用します。関数は、以下のように Behaviour の中に記述します。
public virtual void TransportRecieve(byte[] bytes, int numBytes, int channelId)
{
HandleBytes(bytes, numBytes, channelId);
}
public virtual bool TransportSend(byte[] bytes, int numBytes, int channelId, out byte error)
{
return NetworkTransport.Send(hostId, connectionId, channelId, bytes, numBytes, out error);
}
使用例として、送受信のパケットをログに出力してみます。以下のサンプルは、最初の 50 バイトをログとして出力する NetworkConnection から派生した DebugConnection クラスです。NetworkClient や NetworkServer 上で SetNetworkConnectionClass 関数を呼び出すようにこのクラスを使用します。
class DebugConnection : NetworkConnection
{
public override void TransportRecieve(byte[] bytes, int numBytes, int channelId)
{
StringBuilder msg = new StringBuilder();
for (int i = 0; i < numBytes; i++)
{
var s = String.Format("{0:X2}", bytes[i]);
msg.Append(s);
if (i > 50) break;
}
UnityEngine.Debug.Log("TransportRecieve h:" + hostId + " con:" + connectionId + " bytes:" + numBytes + " " + msg);
HandleBytes(bytes, numBytes, channelId);
}
public override bool TransportSend(byte[] bytes, int numBytes, int channelId, out byte error)
{
StringBuilder msg = new StringBuilder();
for (int i = 0; i < numBytes; i++)
{
var s = String.Format("{0:X2}", bytes[i]);
msg.Append(s);
if (i > 50) break;
}
UnityEngine.Debug.Log("TransportSend h:" + hostId + " con:" + connectionId + " bytes:" + numBytes + " " + msg);
return NetworkTransport.Send(hostId, connectionId, channelId, bytes, numBytes, out error);
}
}