ObjectDeliverer クイックスタート

このページでは、Unreal Engine側でTCP/IPサーバーを動かし、ObjectDeliverer Testerアプリをクライアントとして接続して、メッセージの送受信を完了するまでを説明します。

前提

Blueprintの構成

完成すると、次のようなBlueprintになります。BeginPlayでマネージャーを作成して通信を開始し、EndPlayで終了します。

TCP/IPサーバーを起動するBlueprintの構成例

1. ActorのBlueprintを作成する

  1. Content BrowserでBlueprint Class → Actorを作成し、名前をBP_ObjectDelivererServerなどにします。
  2. Event Graphを開き、BeginPlayとEndPlayイベントを表示します。

2. ObjectDelivererManagerを作成する

Create Object Deliverer Managerを実行し、戻り値を変数(例: Deliverer)に保存します。型はObject Deliverer Manager参照です。

通信中はこの変数を参照し続けるため、ローカル変数ではなくメンバー変数に保存してください。以降の手順でもDeliverer変数を使用します。

3. イベントをバインドする

Delivererから次の3つのイベントを接続します。

イベント発生タイミング引数の意味
Connected接続の準備が完了したときClientSocket 接続相手を表すオブジェクト
Disconnected接続が切断されたときClientSocket 切断した接続相手
ReceiveDataデータを受信したときClientSocket 送信元、Buffer 受信バイト列

この手順では、ConnectedとReceiveDataにPrint Stringを接続して、動作を確認できるようにします。

4. StartでTCP/IPサーバーを開始する

DelivererのStartノードに、次の2つを接続してBeginPlayから実行します。

  • Create Protocol Tcp Ip Server — ポートは9099を指定します。
  • Create Packet Rule Size Body — 初期値(Size Length = 4、Size Buffer Endian = Big)を使用します。

StartのDeliveryBoxピンは未接続のままにします。未接続の場合、送受信はバイト配列で行われます。

5. PIEでサーバーを起動する

PIEを開始します。この時点ではまだConnectedは発生しません。TCP/IPサーバーはクライアントの接続を待ち受けている状態です。

6. Testerアプリから接続する

ObjectDeliverer Testerを起動し、次のとおり設定して接続します。

  1. 通信方式にTCP/IP Clientを選択します。
  2. パケット分割ルールにSizeBodyを選択します。
  3. 接続先にlocalhost、ポートに9099を指定して接続します。

接続が成功すると、Unreal Engine側でConnectedイベントが発生し、Print Stringの出力を確認できます。

7. Testerからメッセージを送受信する

Testerアプリからメッセージを送信すると、Unreal Engine側でReceiveDataイベントが発生します。Bufferには送信したデータがバイト列として格納されています。BufferのLengthをPrint Stringで出力すると、送信したデータサイズが確認できます。

次に、Unreal Engine側から送信します。DelivererのSendノードに任意のバイト配列を渡して実行すると、Testerアプリの受信欄にデータが届きます。

バイト配列のかわりに文字列で送受信したい場合は、ユースケースのDeliveryBoxを切り替えるを参照してください。

8. 通信を終了する

EndPlayからDelivererのCloseを呼び出します。PIEを終了すると、接続中のクライアントが切断され、通信に使ったリソースが解放されます。

Closeを呼ばずにレベルを切り替えると、接続が残ったままになることがあります。終了処理は必ず入れてください。

エラー時の確認

症状確認する項目
Connectedが発生しないTesterの通信方式がTCP/IP Clientか。アドレスとポートがlocalhost:9099と一致しているか。ファイアウォールで遮断されていないか
接続はできるがReceiveDataが発生しない両者のパケット分割ルールがSizeBodyで一致しているか。SizeBodyのSize LengthとSize Buffer Endianが両者で同じか
送信してもTesterに届かない分割ルールの不一致がないか。送信先が正しく接続済みか
PIE終了時にエラーログが出るEndPlayでCloseを呼んでいるか

パケットの結合・分断が原因で通信が失敗する仕組みについては、ユースケースのパケット分割ルールを切り替えるを参照してください。

関連チュートリアル