ストリーミングするバイト
大量のデータまたはBoltのプロパティと共に送信ができないデータのタイプ(画像や辞書など)、もしくはその両方をネットワーク上で送信する必要がある場合、ストリーミングが有効です。
まず、1秒あたりにストリーミングするデータの最大量を設定してください
public override void Connected(BoltConnection connection) {
connection.SetStreamBandwidth(1024 * 20);
}
サーバーのコールバックに配置すると、これによって新しい接続の最初のストリームトラフィックは20kb/秒に設定されます。
その後、クライアント上とホスト上にバイナリのストリーミングチャンネルを作成します。
public static UdpKit.UdpChannelName Voice;
public static UdpKit.UdpChannelName CustomPlayerIcon;
public override void BoltStartBegin()
{
Voice = BoltNetwork.CreateStreamChannel("Voice", UdpKit.UdpChannelMode.Unreliable, 1});
CustomPlayerIcon = BoltNetwork.CreateStreamChannel("CustomPlayerIcon", UdpKit.UdpChannelMode.Reliable, 4});
}
最初のパラメータはチャネルに名前をつけ、2つ目はチャンネルを高信頼性に設定し、3つ目は優先順位を設定します。
その後、データのバイナリストリームをこの接続に送信できます。 以下の例では、Channelsクラス内に作成された「PlayerIcon」チャネルへの静的な参照を使用してカスタムのアイコンテクスチャのバイナリデータをサーバーに送信しています。
void SendCustomIcon(Texture2D myCustomIcon) {
byte[] data = myCustomIcon.EncodeToPNG();
//Streaming bytes in stream channel created in script "Channels"
BoltNetwork.server.StreamBytes(Channels.PlayerIcon, data);
}
それからバイナリストリームデータがいつ受信されるかについて、コールバックが必要となります。
public override void StreamDataReceived(BoltConnection connnection, UdpStreamData data) {
Texture2D icon = new Texture2D(4, 4);
icon.LoadImage(data.Data);
PlayerData playerData = (PlayerData)connection.userToken;
playerData.SetIcon(icon);
}
受信後はデータに対して、任意の処理をおこなえます。 これらの手順をまとめて簡単な例を作成してみましょう。
using UnityEngine;
using System.Collections;
using System.Text;
using UdpKit;
using Bolt;
[BoltGlobalBehaviour()]
public class StreamCallbacks : Bolt.GlobalEventListener
{
public static UdpKit.UdpChannelName testChannel;
public override void BoltStartBegin()
{
testChannel = BoltNetwork.CreateStreamChannel("test", UdpKit.UdpChannelMode.Reliable, 1);
}
public override void SceneLoadRemoteDone(BoltConnection c)
{
if (BoltNetwork.isServer)
{
byte[] data = Encoding.ASCII.GetBytes("Testing");
c.StreamBytes(testChannel, data);
}
}
public override void StreamDataReceived(BoltConnection connection, UdpStreamData data)
{
BoltLog.Info(data);
}
}
ストリーミングするデータ量については留意してください。データ量に上限があります。