ObjectDeliverer Blueprint APIリファレンス

このページでは、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 Threadtrue(既定)の場合、イベントをゲームスレッドで処理する
出力説明
Return Value作成されたマネージャー

戻り値はメンバー変数に保存します。未保存の場合、ガベージコレクションの対象になり、通信が継続できません。

Start

通信を開始します。

入力説明
Protocol通信方式
Packet Ruleパケット分割ルール
Delivery Boxデータ変換方法(省略可。省略時はバイト配列)

すでに通信中の場合は、先にCloseを呼び出してから再開してください。

Close

通信を終了し、接続とリソースを解放します。接続中のクライアントがすべて切断されます。レベルの終了時(EndPlay)に呼び出してください。

Send

全接続先へデータを送信します。

入力説明
Data Buffer送信するバイト配列

SendTo

指定した接続先だけへデータを送信します。TCP/IPサーバーで特定のクライアントに送るときに使用します。

入力説明
Data Buffer送信するバイト配列
TargetConnectedイベントで受け取った接続先オブジェクト

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 ClientIpAddress、Port、Retry、Auto Connect After DisconnectTCP/IPクライアント
Create Protocol Tcp Ip ServerPortTCP/IPサーバー
Create Protocol Tcp Ip Client TlsIpAddress、Port、Retry、Auto Connect After Disconnect、Minimum ProtocolTLS暗号化TCP/IPクライアント(v1.9.0以降)
Create Protocol Tcp Ip Server TlsPort、CertPath、KeyPath、Minimum ProtocolTLS暗号化TCP/IPサーバー(v1.9.0以降)
Create Protocol Udp Socket SenderIpAddress、PortUDP送信専用
Create Protocol Udp Socket Sender with BroadcastIpAddress、Port、Enable BroadcastUDP送信専用(ブロードキャスト対応)
Create Protocol Udp Socket ReceiverBound PortUDP受信専用
Create Protocol Shared MemoryShared Memory Name、Shared Memory Size共有メモリ(Windowsのみ)
Create Protocol Log WriterFile Path、Path Is Absoluteファイル書き込み
Create Protocol Log ReaderFile Path、Path Is Absolute、Cut First Intervalファイル読み込み
Create Protocol Reflectionなしリフレクション(デバッグ用)
Create Protocol Web Socket ClientUrlWebSocketクライアント(v1.7.0以降)
Create Protocol Web Socket Client with ProtocolsUrl、Protocolsサブプロトコル指定付きWebSocketクライアント
Create Protocol Web Socket Client with HeadersUrl、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 CertificatemTLS用にクライアント証明書と秘密鍵のパスを指定する
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 LengthFixed Size固定長で分割する
Create Packet Rule Size BodySize Length、Size Buffer Endianサイズヘッダーを付与する
Create Packet Rule TerminateTerminate終端文字列で分割する(既定は\r\n)
Create Packet Rule Nodivisionなし分割・結合を行わない

送信者と受信者で同じルールを設定してください。詳細はユースケースのパケット分割ルールを参照してください。

DeliveryBox

DeliveryBoxはUDeliveryBoxFactoryのノードで作成します。StartのDeliveryBoxへ渡します。

ノード入力説明
Create Object Delivery Box Using JsonTarget ClassUObjectをJSONへ変換する
Create Dynamic Object Delivery Box Using Jsonなしクラス名を含む形式で複数型を扱う
Create Custom Object Delivery Box Using JsonDefault Serializer Type、Object Serializer Types、Target Classクラスごとにシリアライズ方法を指定する
Create Utf8String Delivery BoxなしUTF-8文字列をそのまま送受信する

UObjectDeliveryBoxUsingJsonのノード

ノード入力出力・イベント
InitializeTarget Class対象クラスを設定する
Initialize CustomDefault Serializer Typeほかクラスごとのシリアライズ方法を設定する
Sendmessage(UObject)maked Json 生成されたJSON文字列
SendTomessage、Destinationmaked Json 生成されたJSON文字列。宛先を限定して送信する
Received—Received Object 復元されたオブジェクト、Received Json String 受信JSON、From Object 送信元

UUtf8StringDeliveryBoxのノード

ノード入力出力・イベント
Sendmessage(FString)なし
SendTomessage、Destinationなし。宛先を限定して送信する
Received—Received String 受信した文字列、From Object 送信元

ロギング

With Object Deliverer LoggerでUObjectDelivererLoggerをマネージャーへ取り付けると、プラグイン内部のログをBlueprintで受け取れます。

On Log Messageイベントは次の引数を持ちます。

引数説明
Messageログ本文
VerbosityEODLogVerbosity(Fatal〜VeryVerbose)
Categoryログカテゴリ

通信が期待どおりに動かないときの原因特定に使用できます。独自のロガーはUObjectDelivererLoggerBaseを継承して作成します。

列挙型

列挙型値用途
EObjectDelivererTlsProtocolTLSv1_2 / TLSv1_1(非推奨) / TLSv1_0(非推奨)TLS最小バージョン(それ以上を許可)
EObjectDelivererClientAuthModeNone / Optional / RequiredTLSサーバーのクライアント証明書要求
ECNBufferEndianBig / LittleSizeBodyのサイズヘッダーのエンディアン
EODJsonSerializeTypeNoWriteType / WriteTypeJSONにクラス名を含めるかどうか
EODLogVerbosityFatal〜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)
{
    // 受信したデータを処理
}

ライフサイクルと保持のまとめ

  1. Create Object Deliverer Managerで作成したマネージャーはメンバー変数で保持します。
  2. Startに渡したProtocol・PacketRule・DeliveryBoxも、通信中はマネージャーが内部で保持します。DeliveryBoxのReceivedイベントを使う場合は、イベントバインドのためにDeliveryBox自身も変数へ保存してください。
  3. TCP/IPサーバー・UDP受信者では、ConnectedイベントのClientSocketとConnectedListで接続先を管理できます。SendToで特定の接続先へ送信できます。
  4. 不要になったらCloseを呼び出します。呼び出さないままオブジェクトが破棄されると、接続が残る可能性があります。