UNET QoS Channels について
UNETでは、通信の品質を選ぶことができます(信頼度と速さに影響します)。
QoS
UNETでは情報伝達の信頼度と速さの品質のことをQoSと呼んでいます(QoSとはQuality of Serviceの略で、品質のことです)。
現状(Unity2017.3)、QoSは11種類用意されており、開発者はこの中から適切なものを選択します。
基本的に、信頼性と速さはトレードオフの関係です。11種のQoSの中で、名前にUnreliableとついたものは速いけど到着する保証がありません(情報がネットワークの途中で失われる恐れあり)。Reliableとついたものは確実に到着しますが、遅いです。
Unreliable
到着は保証されません。送信の順序と到着の順序が入れ替わることもあります。最も軽量です。
使用例:短いログメッセージ
UnreliableFragmented
到着は保証されません。パケットの規程の最大サイズより大きなデータを遅れます(32パケット分まで)。送信前にデータは分割され、受信時に復元されます。
使用例:長いログメッセージ
UnreliableSequenced
到着は保証されませんが、順序は保証されます。
使用例:音声や映像
Reliable
到着が保証されます。順序は保証されません。
使用例:ダメージの送信
ReliableFragmented
UnrealialbeFragmentedと同様、大きなデータを遅れます。なおかつ、到着が保証されます。
使用例:Group Damage(?)
ReliableSequenced
UNETのデフォルトのQoSです。到着と順序が保証されます。
使用例:ファイル送信
StateUpdate
Unreliableと似ていますが、こちらは送信する際と受信する際に、最新の1つのみを送信・受信し、古い情報は破棄します。
使用例:キャラクターの位置情報
ReliableStateUpdate
到着が保証されます。その他はStateUpdateと同じです。
AllCostDelivery
到着が保証されます。緊急性の高い情報に使用します。Reliableでは、ある程度の時間待っても受信応答が無い場合に再送が行われますが、こちらは、受信応答があるまで短い間隔(設定可能?)で再送し続けます。
使用例:発砲、試合開始の合図等
UnreliableFragmentedSequenced
到着が保証されません。大きなサイズが送信できます。順序は保証されます。
ReliableFragmentedSequenced
到着が保証されます。大きなサイズが送信できます。順序が保証されます。
参考:https://blogs.unity3d.com/jp/2014/05/12/announcing-unet-new-unity-multiplayer-technology/
QoS Channels
情報を送る際に使うQoSの種類に番号をつけたものがChannelです。
あらかじめ「Channel 0 はReliableSequenced、Channel 1 は Unreliable」というようにChannelを定義しておき、情報を送る際はChannel番号を指定します。
Channelの定義方法
NetworkManagerの下記の部分で、Channelを定義します。
Channelの指定方法(スクリプト単位)
次のように、クラスに属性でchannel番号を指定できます。
[NetworkSettings(channel = 0)] public class Hoge : NetworkBehaviour { }
同一スクリプト内の全ての通信が影響を受けます(SyncVar、Command、ClientRPC等)。
Channelの指定方法(関数単位)
CommandやClientRPCの関数単位でChannelを指定する場合は、次のようにやります。
[Command(channel = 1)] void CmdHoge() { }
LAN接続前提のこぢんまりとしたゲームを作っている場合は、全ての通信をデフォルトのReliableSequencedで行っても、大して問題ないと思いますが、インターネット接続のゲームを作る場合は、真剣にこのQoSの設定を行う必要があると思われます。