このページでは、ObjectDelivererがBlueprintに公開するAPIを説明します。C++でも同じAPIを利用できます。各APIの使い分けはユースケースを参照してください。
API全体の関係
ObjectDelivererのAPIは4つの要素で構成されます。
| 要素 | 役割 | 主なクラス |
|---|---|---|
| マネージャー | 通信の開始・送信・終了とイベントの通知 | UObjectDelivererManager |
| Protocol | 通信方式 | UProtocolFactoryと各Protocolクラス |
| PacketRule | パケット分割ルール | UPacketRuleFactoryと各PacketRuleクラス |
| DeliveryBox | 送受信データの変換(省略可) | UDeliveryBoxFactoryと各DeliveryBoxクラス |
flowchart TB
M["ObjectDelivererManager<br>Start / Send / Close"] --> P["Protocol"]
M --> R["PacketRule"]
M --> D["DeliveryBox(任意)"]
D -->|"Send / Received"| M
P -->|"Connected / Disconnected / ReceiveData"| M
UObjectDelivererManager
通信全体を管理するクラスです。Startの実行からCloseまで、通信中は必ず参照を保持してください。
Create Object Deliverer Manager
マネージャーを作成します。
| 入力 | 説明 |
|---|---|
| Is Event With Game Thread | true(既定)の場合、イベントをゲームスレッドで処理する |
| 出力 | 説明 |
|---|---|
| Return Value | 作成されたマネージャー |
戻り値はメンバー変数に保存します。未保存の場合、ガベージコレクションの対象になり、通信が継続できません。
Start
通信を開始します。
| 入力 | 説明 |
|---|---|
| Protocol | 通信方式 |
| Packet Rule | パケット分割ルール |
| Delivery Box | データ変換方法(省略可。省略時はバイト配列) |
すでに通信中の場合は、先にCloseを呼び出してから再開してください。
Close
通信を終了し、接続とリソースを解放します。接続中のクライアントがすべて切断されます。レベルの終了時(EndPlay)に呼び出してください。
Send
全接続先へデータを送信します。
| 入力 | 説明 |
|---|---|
| Data Buffer | 送信するバイト配列 |
SendTo
指定した接続先だけへデータを送信します。TCP/IPサーバーで特定のクライアントに送るときに使用します。
| 入力 | 説明 |
|---|---|
| Data Buffer | 送信するバイト配列 |
| Target | Connectedイベントで受け取った接続先オブジェクト |
IsConnected
接続済みかどうかを返します(true: 接続中、false: 切断)。
ConnectedList
現在接続中の接続先オブジェクトの一覧(読み取り専用)。TCP/IPサーバーで複数クライアントを扱うときに使用します。
With Object Deliverer Logger
ロギングで説明するロガーを取り付けます。戻り値はマネージャー自身のため、作成直後に続けて呼び出せます。nullptrを渡すと取り外します。
Is Event With Game Thread
イベントをゲームスレッドで処理するかどうかの設定(既定: true)。Create Object Deliverer Managerの引数と同じ項目です。
イベント
| イベント | 発生タイミング | 引数 |
|---|---|---|
| Connected | 接続の準備が完了したとき | ClientSocket 接続相手を表すオブジェクト |
| Disconnected | 接続が切断されたとき | ClientSocket 切断した接続相手 |
| ReceiveData | データを受信したとき | ClientSocket 送信元、Buffer 受信したバイト配列 |
Protocol
ProtocolはUProtocolFactoryのノードで作成します。作成したProtocolはStartへ渡します。
UProtocolFactoryのノード一覧
| ノード | 主な入力 | 説明 |
|---|---|---|
| Create Protocol Tcp Ip Client | IpAddress、Port、Retry、Auto Connect After Disconnect | TCP/IPクライアント |
| Create Protocol Tcp Ip Server | Port | TCP/IPサーバー |
| Create Protocol Tcp Ip Client Tls | IpAddress、Port、Retry、Auto Connect After Disconnect、Minimum Protocol | TLS暗号化TCP/IPクライアント(v1.9.0以降) |
| Create Protocol Tcp Ip Server Tls | Port、CertPath、KeyPath、Minimum Protocol | TLS暗号化TCP/IPサーバー(v1.9.0以降) |
| Create Protocol Udp Socket Sender | IpAddress、Port | UDP送信専用 |
| Create Protocol Udp Socket Sender with Broadcast | IpAddress、Port、Enable Broadcast | UDP送信専用(ブロードキャスト対応) |
| Create Protocol Udp Socket Receiver | Bound Port | UDP受信専用 |
| Create Protocol Shared Memory | Shared Memory Name、Shared Memory Size | 共有メモリ(Windowsのみ) |
| Create Protocol Log Writer | File Path、Path Is Absolute | ファイル書き込み |
| Create Protocol Log Reader | File Path、Path Is Absolute、Cut First Interval | ファイル読み込み |
| Create Protocol Reflection | なし | リフレクション(デバッグ用) |
| Create Protocol Web Socket Client | Url | WebSocketクライアント(v1.7.0以降) |
| Create Protocol Web Socket Client with Protocols | Url、Protocols | サブプロトコル指定付きWebSocketクライアント |
| Create Protocol Web Socket Client with Headers | Url、Protocols、Headers | ヘッダー指定付きWebSocketクライアント |
各Protocolの挙動と使い分けの詳細は、ユースケースの対応する節を参照してください。
Protocolオブジェクト共通のノード
各Protocolオブジェクト(Create Protocol ...の戻り値の型)には、次のノードが用意されています(一部のProtocolを除く)。
| ノード | 説明 |
|---|---|
| Initialize系 | Create Protocolを使わず、オブジェクトのSpawn時に直接初期化する |
| With Receive Buffer Size | 受信バッファサイズ(バイト)を指定する |
| With Send Buffer Size | 送信バッファサイズ(バイト)を指定する |
With ...系のノードは戻り値としてProtocol自身を返すため、続けて呼び出せます。バッファサイズの既定値は1MBです。
GetIPAddress / GetIPAddressInString
TCP/IP系のProtocolオブジェクトと、サーバーが受け入れた接続先(ClientSocket)で使用できます。IPアドレスをバイト列または文字列で取得します。送信元を判別したい場合に使用します。
WebSocketクライアントの追加ノード
| ノード | 説明 |
|---|---|
| Set Auto Reconnect | 切断後に自動で再接続するかどうかを設定する |
| Set Reconnect Delay | 再接続までの待ち時間(秒)を設定する |
TLSクライアントの追加ノード(UProtocolTcpIpClientTls)
Create Protocol Tcp Ip Client Tlsの戻り値には、証明書の検証方法を指定するノードが用意されています。
| ノード | 説明 |
|---|---|
| With Pinned Public Key | 期待するサーバー公開鍵のSHA-256フィンガープリントを直接指定する |
| With Pinned Public Key From File | フィンガープリントを記述したファイルのパスを指定する |
| With Client Certificate | mTLS用にクライアント証明書と秘密鍵のパスを指定する |
| With Certificate Verification | 標準の証明書検証を有効にする |
| With Trusted Ca Certificate | 信頼するCA証明書のパスを指定する(プライベートCA運用など) |
| With Peer Verification Disabled | サーバー証明書の検証を無効化する(非推奨。詳細は運用ページを参照) |
| With Allow Self Signed Certificates | 自己署名証明書を許可する |
| Get Last Tls Error | 直近のTLS接続失敗の理由を文字列で取得する |
Get Last Tls Errorは、ハンドシェイク失敗(信頼できないCAが署名した証明書チェーンなど)、証明書やCAの設定不備、ハンドシェイク直後の切断の理由を返します。接続が確立した時点でクリアされます。
TLSサーバーの追加ノード(UProtocolTcpIpServerTls)
| ノード | 説明 |
|---|---|
| With Client Auth Mode | クライアント証明書を要求するかどうかをEObjectDelivererClientAuthModeで指定する |
| With Client Ca Bundle | クライアント証明書の検証に使うCAバンドルのパスを指定する |
PacketRule
PacketRuleはUPacketRuleFactoryのノードで作成します。
| ノード | 入力 | 説明 |
|---|---|---|
| Create Packet Rule Fixed Length | Fixed Size | 固定長で分割する |
| Create Packet Rule Size Body | Size Length、Size Buffer Endian | サイズヘッダーを付与する |
| Create Packet Rule Terminate | Terminate | 終端文字列で分割する(既定は\r\n) |
| Create Packet Rule Nodivision | なし | 分割・結合を行わない |
送信者と受信者で同じルールを設定してください。詳細はユースケースのパケット分割ルールを参照してください。
DeliveryBox
DeliveryBoxはUDeliveryBoxFactoryのノードで作成します。StartのDeliveryBoxへ渡します。
| ノード | 入力 | 説明 |
|---|---|---|
| Create Object Delivery Box Using Json | Target Class | UObjectをJSONへ変換する |
| Create Dynamic Object Delivery Box Using Json | なし | クラス名を含む形式で複数型を扱う |
| Create Custom Object Delivery Box Using Json | Default Serializer Type、Object Serializer Types、Target Class | クラスごとにシリアライズ方法を指定する |
| Create Utf8String Delivery Box | なし | UTF-8文字列をそのまま送受信する |
UObjectDeliveryBoxUsingJsonのノード
| ノード | 入力 | 出力・イベント |
|---|---|---|
| Initialize | Target Class | 対象クラスを設定する |
| Initialize Custom | Default Serializer Typeほか | クラスごとのシリアライズ方法を設定する |
| Send | message(UObject) | maked Json 生成されたJSON文字列 |
| SendTo | message、Destination | maked Json 生成されたJSON文字列。宛先を限定して送信する |
| Received | — | Received Object 復元されたオブジェクト、Received Json String 受信JSON、From Object 送信元 |
UUtf8StringDeliveryBoxのノード
| ノード | 入力 | 出力・イベント |
|---|---|---|
| Send | message(FString) | なし |
| SendTo | message、Destination | なし。宛先を限定して送信する |
| Received | — | Received String 受信した文字列、From Object 送信元 |
ロギング
With Object Deliverer LoggerでUObjectDelivererLoggerをマネージャーへ取り付けると、プラグイン内部のログをBlueprintで受け取れます。
On Log Messageイベントは次の引数を持ちます。
| 引数 | 説明 |
|---|---|
| Message | ログ本文 |
| Verbosity | EODLogVerbosity(Fatal〜VeryVerbose) |
| Category | ログカテゴリ |
通信が期待どおりに動かないときの原因特定に使用できます。独自のロガーはUObjectDelivererLoggerBaseを継承して作成します。
列挙型
| 列挙型 | 値 | 用途 |
|---|---|---|
| EObjectDelivererTlsProtocol | TLSv1_2 / TLSv1_1(非推奨) / TLSv1_0(非推奨) | TLS最小バージョン(それ以上を許可) |
| EObjectDelivererClientAuthMode | None / Optional / Required | TLSサーバーのクライアント証明書要求 |
| ECNBufferEndian | Big / Little | SizeBodyのサイズヘッダーのエンディアン |
| EODJsonSerializeType | NoWriteType / WriteType | JSONにクラス名を含めるかどうか |
| EODLogVerbosity | Fatal〜VeryVerbose | ログの重要度 |
C++での実装例
TCPサーバーをC++で実装する例です。Blueprintの構成と同じ要素を使用します。
void UMyClass::Start()
{
auto deliverer = UObjectDelivererManager::CreateObjectDelivererManager();
// イベントハンドラーを設定
deliverer->Connected.AddDynamic(this, &UMyClass::OnConnect);
deliverer->Disconnected.AddDynamic(this, &UMyClass::OnDisConnect);
deliverer->ReceiveData.AddDynamic(this, &UMyClass::OnReceive);
// 通信を開始
// プロトコル: TCP/IP サーバー
// データ分割ルール: ヘッダー(サイズ) + ボディ
// シリアライゼーション方法: バイト配列
deliverer->Start(UProtocolFactory::CreateProtocolTcpIpServer(9099),
UPacketRuleFactory::CreatePacketRuleSizeBody());
}
void UMyClass::OnConnect(UObjectDelivererProtocol* ClientSocket)
{
// データを送信
TArray<uint8> buffer;
deliverer->Send(buffer);
}
void UMyClass::OnDisConnect(UObjectDelivererProtocol* ClientSocket)
{
// 切断を処理
UE_LOG(LogTemp, Log, TEXT("closed"));
}
void UMyClass::OnReceive(UObjectDelivererProtocol* ClientSocket, const TArray<uint8>& Buffer)
{
// 受信したデータを処理
}
ライフサイクルと保持のまとめ
Create Object Deliverer Managerで作成したマネージャーはメンバー変数で保持します。Startに渡したProtocol・PacketRule・DeliveryBoxも、通信中はマネージャーが内部で保持します。DeliveryBoxのReceivedイベントを使う場合は、イベントバインドのためにDeliveryBox自身も変数へ保存してください。- TCP/IPサーバー・UDP受信者では、
ConnectedイベントのClientSocketとConnectedListで接続先を管理できます。SendToで特定の接続先へ送信できます。 - 不要になったら
Closeを呼び出します。呼び出さないままオブジェクトが破棄されると、接続が残る可能性があります。