ObjectDeliverer ユースケース

このページでは、目的に合わせたProtocol・PacketRule・DeliveryBoxの選び方と、代表的なユースケースを説明します。ノードごとの入出力の詳細はBlueprint APIリファレンスを参照してください。

Protocolを選ぶ

目的Protocol備考
確実にデータを届けたいTCP/IPサーバー/クライアント再送機能あり。分割ルールの選択が重要
通信を暗号化したいTCP/IP TLSサーバー/クライアントv1.9.0以降。証明書が必要
毎Tickの状態送信など、多少のロスを許容したいUDP送信者/受信者再送なしで高速。ブロードキャストも可能
Webシステムと接続したいWebSocketクライアントv1.7.0以降。wssで暗号化、自動再接続も設定可能
同じPC上のアプリと高速に通信したい共有メモリWindowsのみ。ネットワークを経由しない
データをファイルに残したいファイル書き込み/読み込みアプリ終了後もファイルで確認できる
実装前にイベントの流れを確認したいリフレクション自分自身で送受信する。デバッグ用

共通のライフサイクルはすべてのProtocolで同じです。Create Object Deliverer Managerで作成したマネージャーを変数に保持し、StartでProtocol・PacketRule(・DeliveryBox)を渡して開始、Connected/Disconnected/ReceiveDataイベントで結果を受け取り、不要になったらCloseを呼び出します。

プロトコルを切り替える

プロトコルを変更するには、Startに渡すProtocolノードを差し替えるだけです。イベントのバインドや受信後の処理はそのまま使えます。

たとえば、TCP/IPサーバーで始めた通信をUDP送信者に切り替えるには、Create Protocol Tcp Ip ServerをCreate Protocol Udp Socket Senderに置き換えます。

UDP送信プロトコルへ切り替えたBlueprintの例

C++では次のように書きます。

deliverer->Start(UProtocolFactory::CreateProtocolUdpSocketSender("192.168.0.100", 9099),
                 UPacketRuleFactory::CreatePacketRuleSizeBody());
StartノードのProtocolとPacketRuleの接続例

独自のカスタムProtocolを作成することも可能です。

以下、各Protocolの特徴と設定項目を説明します。

TCP/IPサーバー、クライアント

TCP/IP通信用のProtocolです。TCP/IPは一対多通信に対応しているため、単一のサーバーに複数のクライアントが接続できます。

パケット再送機能を備えているため、送信されたメッセージは確実に受信者へ届けられます。ただし、複数パケットの送信時に、複数回分のパケットが結合して届いたり、1回分のメッセージの途中で分断されて届いたりすることがあります。そのため、パケット分割ルールにはNodivision以外の使用を推奨します。

TCP/IPサーバープロトコルのBlueprint構成例

Create Protocol Tcp Ip Server

パラメータ説明
Portサーバーが通信を待ち受けるポート

Create Protocol Tcp Ip Client

パラメータ説明
IpAddressサーバーが待ち受けているIPアドレス
Portサーバーが待ち受けているポート
Retry接続失敗時に自動でリトライする
Auto Connect After Disconnect切断後に自動で再接続を試みる

TCP/IPの特徴

項目説明
再送機能あり
常時接続あり
相性の良い分割ルールFixedLength、Terminate、SizeBody(Nodivisionは向いていない)
信頼性高い
注意点パケットが結合したり分断して届く場合がある

UDP送信者、受信者

UDP通信用のProtocolです。TCP/IPと異なり、UDPは接続ステップなしに受信者へメッセージを一方的に送信します。

パケット再送機能がないため、ネットワーク状況によってはパケットが届かない場合があります。その分、TCP/IPより高いパフォーマンスを提供します。毎Tick状態を送る機能など、まれにパケットが届かなくても問題ない用途に適しています。

UDP送信・受信プロトコルのBlueprint構成例

Create Protocol Udp Socket Sender

パラメータ説明
IpAddress送信先のIPアドレス
Port送信先のポート番号

Create Protocol Udp Socket Sender with Broadcast

パラメータ説明
IpAddress送信先のIPアドレス
Port送信先のポート番号
Enable Broadcastブロードキャスト送信を有効にする

Create Protocol Udp Socket Receiver

パラメータ説明
Bound Port受信を待ち受けるポート番号

UDPの特徴

項目説明
再送機能なし
常時接続なし
相性の良い分割ルールNodivision(その他のルールも使用可能)
注意点パケットがロストする場合がある

WebSocketクライアント

WebSocketのクライアントです。WebシステムのWebSocketサーバーと接続できます。v1.7.0以降で利用できます。

ws://に加えてwss://のURLを使用した暗号化通信にも対応しています。Set Auto Reconnectで切断後の自動再接続を、Set Reconnect Delayで再接続までの待ち時間(秒)を設定できます。

WebSocketクライアントプロトコルのBlueprint構成例

Create Protocol Web Socket Client

パラメータ説明
UrlWebSocketサーバーのURL(例: ws://localhost:8080)

Create Protocol Web Socket Client with Protocols

パラメータ説明
UrlWebSocketサーバーのURL
Protocolsサブプロトコルのリスト

Create Protocol Web Socket Client with Headers

パラメータ説明
UrlWebSocketサーバーのURL
Protocolsサブプロトコルのリスト
Headersカスタムヘッダーのリスト

WebSocketの特徴

項目説明
再送機能あり
常時接続あり
相性の良い分割ルールNodivision(その他のルールも使用可能)

共有メモリ

共有メモリは、複数のアプリケーションで共有できるメモリ空間を作成し、この空間へメッセージの書き込みと読み込みを行うProtocolです。

ネットワーク通信ではないため、同じPC上でのみ送受信が可能です。その代わり、他の方式と比べて優れた読み書き速度を提供するため、大きなメッセージのやり取りに適しています。

データが書き込まれたことを受信側が知る方法がないため、受信側は定期的にメモリを読み込んで新しい書き込みを確認する必要があります。ObjectDelivererはこの処理を自動的に行うため、通常ユーザーが意識する必要はありません。ただし、サードパティが作成したメモリを読み込む場合は、相手の読み込みルールを確認してください。

共有メモリプロトコルのBlueprint構成例

Create Protocol Shared Memory

パラメータ説明
Shared Memory Name共有メモリの識別名
Shared Memory Size共有メモリのサイズ(バイト単位)

共有メモリの特徴

項目説明
再送機能なし
常時接続なし
相性の良い分割ルールFixedLength、Terminate、SizeBody(Nodivisionは向いていない)
注意点Windowsでのみ使用可能
注意点受信側がポーリングするため、送信値がスキップされる可能性がある

ファイル書き込み、読み込み

特定のファイルへメッセージの書き込みと読み込みを行うProtocolです。

動作は共有メモリと似ていますが、実際のファイルに書き込むため、アプリケーション終了後もメッセージを確認できます。データを保存しておく用途に適しています。

ファイル読み書きプロトコルのBlueprint構成例

Create Protocol Log Writer

パラメータ説明
File Path書き込み先のファイルパス
Path Is Absoluteファイルパスが絶対パスかどうか

Create Protocol Log Reader

パラメータ説明
File Path読み込むファイルパス
Path Is Absoluteファイルパスが絶対パスかどうか
Cut First Interval初回の読み込み間隔をスキップするかどうか

ファイルの特徴

項目説明
再送機能なし
常時接続なし
相性の良い分割ルールFixedLength、Terminate、SizeBody(Nodivisionは向いていない)
注意点受信側がポーリングするため、送信値がスキップされる可能性がある

リフレクション

自分自身でメッセージの送受信を行うProtocolです。メッセージを送信すると、同じインスタンス上で受信イベントが発生します。他のインスタンスとメッセージを交換することはできません。

主に開発時のデバッグ目的での使用を想定しています。

リフレクションプロトコルのBlueprint構成例

リフレクションの特徴

項目説明
再送機能なし
常時接続なし
相性の良い分割ルールなんでも
注意点デバッグ用

TLS/mTLSで暗号化する

TCP/IPにTLSを追加した暗号化通信Protocolです(v1.9.0以降)。TCP/IPと同様の一対多通信に対応し、通信内容の暗号化と証明書ベースの認証を行えます。

用途に応じて、自己署名証明書と公開鍵ピンニング、カスタムCA証明書、双方向TLS(mTLS)などの構成を選べます。サーバー側ではサーバー証明書と秘密鍵のファイルパスを指定します。

TLS通信用プロトコルのBlueprint構成例

Create Protocol Tcp Ip Server Tls

パラメータ説明
Portサーバーが通信を待ち受けるポート
CertPathサーバー証明書ファイルのパス
KeyPathサーバー秘密鍵ファイルのパス
Minimum ProtocolTLSの最小バージョン(指定以上を許可)

Create Protocol Tcp Ip Client Tls

パラメータ説明
IpAddressサーバーが待ち受けているホスト名またはIPアドレス
Portサーバーが待ち受けているポート
Retry接続失敗時に自動でリトライする
Auto Connect After Disconnect切断後に自動で再接続を試みる
Minimum ProtocolTLSの最小バージョン(指定以上を許可)

TCP/IP TLSの特徴

項目説明
再送機能あり
常時接続あり
相性の良い分割ルールFixedLength、Terminate、SizeBody(Nodivisionは向いていない)
信頼性高い
注意点証明書の構成(CA/自己署名/ピンニング/mTLS)により必要なオプションが変わる

TLSオプションの選定(どのユースケースで何を有効化するか)はFAQ: ユースケース別TLSオプション構成に、証明書の検証と信頼ポリシーはデータ形式と運用にまとめています。

ObjectDelivererのTLSクライアントと通信できるTLSサーバーのサンプルをGitHubで公開しています。レポジトリはAyumaxSoft/TLSServerSampleです。

パケット分割ルールを切り替える

TCP/IPなどのプロトコルでは、1つのメッセージが複数のパケットに分割されたり、逆に複数のメッセージが1つのパケットにまとめられたりすることがあります。ObjectDelivererはパケット分割ルール(PacketRule)でこの問題に対応します。

プロトコルと同様に、Startに渡すノードを差し替えるだけで分割ルールを指定できます。

ObjectDelivererは次の分割ルールをサポートしています。独自のカスタムルールを作成することも可能です。

  • FixedLength
  • Terminate
  • SizeBody
  • Nodivision

送信者と受信者は同じ分割ルールを使用する必要があります。サードパティが作成したプログラムと通信する場合は、相手がどの分割ルールを使用しているかを事前に確認してください。

FixedLength

FixedLengthは、各メッセージに固定の長さを設定してメッセージを分割するルールです。すべての送信でパケットサイズが固定されるため、分割ロジックがシンプルになります。ただし、指定したサイズより大きなメッセージは送信できない制限があります。

FixedLengthパケット分割ルールのBlueprint設定例

Create Packet Rule Fixed Length

パラメータ説明
Fixed Size固定パケットサイズ(バイト単位)

Terminate

Terminateは、特定の値を区切り文字としてメッセージを区切るルールです。改行文字でメッセージを区切る使い方がよく行われます。メッセージ長を動的に変更できますが、毎回終端値を検索するため、パフォーマンスがわずかに低下します。

Terminateを指定しない場合、改行コード\r(0x0d)\n(0x0a)が使用されます。

Terminateパケット分割ルールのBlueprint設定例

Create Packet Rule Terminate

パラメータ説明
Terminate終端文字列(区切り文字)。未指定時は改行コードが使われる

SizeBody

SizeBodyは、メッセージの先頭にメッセージサイズを埋め込むルールです。メッセージサイズを動的にでき、分割ロジックも比較的シンプルなため、優れたパフォーマンスを提供します。

SizeBodyパケット分割ルールのBlueprint設定例

Create Packet Rule Size Body

パラメータ説明
Size Lengthサイズ情報のバイト数(1、2、4、8)
Size Buffer Endianエンディアン(BigまたはLittle)

Nodivision

Nodivisionは、受信した各パケットについて分割や結合を行わず、そのまま1つのメッセージとして扱うルールです。

Nodivisionパケット分割ルールのBlueprint設定例

Create Packet Rule Nodivision

パラメータ説明
なしこのルールにパラメータはない

DeliveryBoxを切り替える

既定では、ObjectDelivererはバイト配列で送受信します。DeliveryBoxを指定すると、指定した形式のデータへ自動変換できます。毎回手動でバイト配列へ変換する必要がなくなります。

Note

DeliveryBoxを使用する場合、データの送信と受信はObjectDelivererManagerではなくDeliveryBoxを経由することに注意してください。

DeliveryBoxをStartに渡すBlueprintの構成例

C++では次のように書きます。

auto deliverybox = UDeliveryBoxFactory::CreateObjectDeliveryBoxUsingJson(SampleObject::StaticClass());
deliverybox->Received.AddDynamic(this, &UMyClass::OnReceiveObject);

deliverer->Start(UProtocolFactory::CreateProtocolTcpIpServer(9099),
                 UPacketRuleFactory::CreatePacketRuleSizeBody(), deliverybox);

送信もDeliveryBox経由で行います。

DeliveryBoxのSendノードの使用例
auto message = NewObject<SampleMessage>();
deliveryBox->Send(message);

ObjectDelivererは次のDeliveryBoxをサポートしています。独自のカスタムDeliveryBoxを作成することも可能です。

  • ObjectDeliveryBoxUsingJson
  • Utf8StringDeliveryBox

ObjectDeliveryBoxUsingJson

任意のユーザー定義UObjectクラスをJSON文字列へ変換して送受信するDeliveryBoxです。

Unreal Engineで使用できるすべてのクラスはUObjectを継承しているため、多くのクラスのインスタンスをそのまま送受信できます。JSON形式でのメッセージ交換は他のプログラミング言語でも一般的なため、他のアプリケーションとの通信にも使えます。

ObjectDeliveryBoxUsingJsonのBlueprint構成例

JSONへのシリアライズ形式(クラス名を含むかどうか)の選び方についてはFAQ: ObjectDeliveryBoxUsingJsonの利用方法を参照してください。

Utf8StringDeliveryBox

任意の文字列をそのまま送受信するためのDeliveryBoxです。エンコーディングはUTF-8で行われます。

Utf8StringDeliveryBoxのBlueprint構成例