Unreal Engine 5を使ってみる その21(ObjectDeliverer、Node-RED、TCP/UDP通信)
はじめに
今回はUnreal EngineのプラグインであるObject Delivererを利用して、Node-REDとのTCP/UDP通信を試してみました。
HTTP通信については以前の記事で利用したことがあります。
▼こちらの記事でHTTP Blueprintを試しました。
HTTP通信では通信間隔が遅いことがあったので、他の通信方法を利用できないか探していました。TCP/UDP通信の方が高速なら、今後利用していこうと思います。
▼以前の記事はこちら
プラグインの追加
今回はUnreal Engine 5.5を利用します。
▼PCは10万円ぐらいで購入したゲーミングノートPCを利用しています。Windows 11の環境です。
ObjectDelivererは有料のプラグインです。購入して、エンジンにインストールしました。
▼Fabでの販売ページはこちら
https://www.fab.com/ja/listings/b6ffd7d7-80da-483f-a7fa-09cb46b72651
▼Epic Games LauncherのFabライブラリから、Unreal Engine 5.5にプラグインをインストールしました。

▼プロジェクトでプラグインを追加して、再起動しました。

なおドキュメントとサンプルのページがあります。
▼ドキュメントはこちら
▼GitHubのサンプルプロジェクトのページはこちら。プラグインが入っているので、購入しなくても試せそうです。
https://github.com/ayumax/ObjectDeliverer
サンプルとなるブループリントは、これらのページを参考にしています。
TCP通信
予めNode-REDのTCPノードで送受信の方法を確認しておきました。
▼tcp requestとtcp inノードで確認しました。

▼4010ポートでメッセージの受信ができました。Bufferですね。

▼詳細をクリックすると、stringやrawで表示することができます。


同様にして、まずはUnreal Engine側からデータを送信してみます。
▼サンプルをもとに、Event Begin Playで実行する処理のフローを作成しました。送信先は先程の4010ポートです。

▼状況に合わせた表示をオフにしないと、Startなどのノードが表示されないことがありました。


▼Event Tickでデータを送信します。

この状態でプレイしてみました。
▼メッセージを受信できました!

▼最初の文字は取り除く必要があるかもしれません。


次に、Unreal Engine側で受信できるか試してみました。
▼色々試した結果、以下のフローなら受信できました。

先程とは違ってPacket RuleはNodividionでないと、受信した結果が出力されませんでした。
▼Node-REDからはtcp requestノードと、tcp outノードで送信してみました。

▼受信できました!

これでTCP通信による双方向通信ができました。送受信用にそれぞれStartしたいときは、Delivery Boxを別変数で定義する必要があります。
▼なお、Unreal Engineからデータを送信するときのPacket RuleもNodividionにしてみると、余計な文字が含まれていませんでした。


UDP通信
UDP通信も予めNode-REDでの通信方法を確認しておきました。
▼5010ポートで送信と受信をするようにしたところ、通信できていました。


同様にUnreal Engineとも通信してみます。TCP通信のときのフローで、Protocolだけ変更すると通信できました。
▼UDP SocketのSenderとReceiverに変更しています。


▼Node-RED側は5010ポートで受信して、5020ポートに送信するようにしています。

実行して動作を確認しました。
▼送受信できました!


UDP通信でも双方向に通信できました。Protocolだけ変更すれば通信方法を変更できるのは楽でいいですね。
最後に
HTTP通信以外の通信手法も利用できるようになりました。細かく検証したわけでは無いのですが、HTTP通信のときよりも高速なのではないかと思います。
Shared Memoryの方が早そうな気がするので、また試してみます。そもそもプログラミングでShared Memoryを扱ったことが無いので、JavaScriptとPythonで扱えるのか調べようと思っています。
今回はプラグインのノードを利用したわけですが、標準で用意しておいてほしいところですね。オンラインマルチプレイ以外で通信して使う用途があまりないのでしょうか。