データストリーミング
時には、ネットワークを介して大量のデータを送信したい場合(プレイヤーによって構築されたマップを同期する時など)があるでしょう。しかし、ネットワークプロパティもリモートプロシージャコール(RPC)も、このタスクには向いておらず、通常は大きなペイロードを送信するために使用すべきではありません。ここで、FusionのデータストリーミングAPIの出番となります。
NetworkRunner
のSendReliableDataToPlayer
/SendReliableDataToServer
メソッドは、大きなバイト列を送信するために使用できます。
C#
// Large data that needs to be sent
byte[] largeData = new byte [10000];
// Provide 4 numbers as a unique key for the data
var key = ReliableKey.FromInts(42, 0, 0, 0);
// Use in shared mode or as the server/host to send data to players
runner.SendReliableDataToPlayer(playerRef, key, largeData);
// Use as a client to send data to the server/host
runner.SendReliableDataToServer(key, largeData);
内部的には、データは複数のフラグメントに分割された後、サーバー/対象クライアントに送られ、再構築されます。
データの受信が完了すると、INetworkRunnerCallbacks.OnReliableDataReceived
コールバックが呼び出されます。データ転送ステータスを追跡するためのコールバックも提供されています。
C#
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment<byte> data) { }
public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress) { }
複数のデータセットを並列にストリーミングすることも可能で、各データは16バイトの(4つのint
または2つのulong
から作られる)key
で識別されます。
key
は、メタデータ(受信完了後のデータをどのオブジェクトが処理するかなど)を送信するために使用することもできます。これは、複数のクラスがOnReliableDataReceived
コールバックを実装していて、それぞれが特定の受信データのみに関心があるような場合に必要になることがあります。