ObjectDeliverer Ver 1.5.0リリース ObjectのJsonシリアライズ機能の強化

本日ObjectDelivererのVer 1.5.0をマーケットプレイスにリリースしました。 ObjectDeliverer:ayumax:Code Plugins - UE4 マーケットプレイス 今回の実装内容はObjectのJsonシリアライズ機能の強化です。 これについては以前の記事に現状の課題として書いていました。 UObjectをJsonにシリアライズしよう - AYU MAX 今回のリリースでは上記課題を改善する機能実装になります。 実装項目 以下の2項目を対応しました。 プロパティ名の変換 How to change property name when serializing UObject with Json(Version 1.5.0 or later) · ayumax/ObjectDeliverer Wiki · GitHub シリアライズ対象のクラスにIODConvertPropertyNameインターフェイスを実装することで、プロパティ名の変換ができるようになりました。 使用例) // 変換前 { "Prop2": 1, "ObjProp": { "ValueB": 0, "ValueA": 0 }, "ObjProp2": { "ValueC": "abc" } } // 返還後 { "IntProperty": 1, "ObjectPropertyA": { "ValueB": 0, "ValueA": 0 }, "ObjectPropertyB": { "ValueC": "abc" } } この機能を使うことで以下のようなことが可能になります ...

2020-01-24 · 1 分 · 140 文字 · ayumax

UE4+ARKitで作る遠隔タッチディスプレイ

先日頭の中にあったアイデアを形にしたくて、↓こんなものをつくりました。 {{< x user=“ayuma_x” id=“1210122895520718849” >}} iPadの上を指でなぞると、iPadの中のディスプレイに線が引かれているのですが、iPadを取り除くと実際のディスプレイにも同じ線が引かれています。 これは初見だと混乱するかもしれませんが、実はiPad側には何も表示は加えていません。iPadのディスプレイにはカメラの映像のみ表示しています。 何をしたかったのか? 少し前に仕事でiPad使ってARのコンテンツを作っていたのですが、その時に感じた「AR=[何か表示を重ねる]以外の使い方を考えてみたいな」と思ったのがきっかけです。 今回行った内容も多分誰かが似たようなことはやっているのだとは思いますが、「自分で考えてアイデアを形にすることに意味がある」ということでやってみました。 今回の実験においてiPadは入力機器として使います。 ARKitには画像検知や物体検知の機能があり、これをうまく使うことで遠隔タッチディスプレイを作ろうというアイデアです。 やるべきこと このアイデアを形にするためにやるべきことを以下にまとめました。 今回iPadのアプリケーションはUE4(4.24)のHandheld AR ブループリント テンプレートをベースに作ります。 iPadに映っているディスプレイの位置、角度を知る iPadに触れた指の位置をディスプレイの相対座標として知る iPadからPC側に座標を送る PC側で送られた座標にしたがって線を引く iPadに映っているディスプレイの位置、角度を知る まずはディスプレイの位置を知る必要があります。 位置を知る方法として「画像を利用したマーカー方式」と「物体検知」の2通りを考えましたが今回は物体検知を選びました。 UE4+ARKitでの物体検知の使い方は以前記事にしているので、興味ある方はみてください。 UE4でARKitの物体検出機能を使う - AYU MAX まずはディスプレイをスキャンして検知するためのデータづくりを行ったのですが、ディスプレイの形状に特徴点が少なく満足する結果が得られませんでした。 そこでディスプレイ横のごちゃごちゃした所の検知データを作成し、ディスプレイの位置、角度はそのポイントからの相対位置で判断するようにしました。 当然ですが、この方法ではディスプレイとの位置関係を変えてしまうと破綻します。 ↓スキャンしているところ スキャン後にディスプレイの位置、角度を知るのは上記した以前の記事の内容そのままです。 iPadに触れた指の位置をディスプレイの相対座標として知る 次にiPadに触れた指の位置を知るにはどうすれば良いか考えます。 今回使っているUE4のARテンプレートの中の実装には、タッチしたポイントにActorがあるかどうか調べるロジック(BP_ARPawnのWorldHitTest関数)があります。 これをちょっといじってディスプレイの位置を知ることを考えました。 まず現実世界のディスプレイと同じ大きさになるような板メッシュを用意してレベルに配置しておきます。このメッシュは見える必要はないので透明なマテリアルをつけときました。 次に毎Tick, ARKitが現実のディスプレイを検知した位置、角度にこのメッシュを移動させます。 次にWorldHitTest関数の中を見ると、LIneTraceForObjectsというノードが使用されているのが分かります。 LIneTraceForObjectsは指定した2点の間に3Dオブジェクトがあるかどうかの判定ができます。 このノードと直前に配置されているDeproject Screen to Worldを組み合わせると、タッチしたときのiPad上のスクリーン座標(x, y)から触れている場所に配置してある3Dオブジェクトが特定できます。 この仕組みを使うと、先ほど配置したメッシュを指で触れているかどうかということが分かります。 ただし、今回知りたいのはディプレイのどこを触れているかなので、もう少し詳細な情報が必要です。 そこでLIneTraceForObjectsで返される値をFind Collision UVに入れる部分を足してみました。 これで触れた3Dオブジェクトの表面のどの部分(UV座標)という情報までとれます。 ※ Find Collision UVを使うにはProject SettingsでSupport UV From Hit ResultsのチェックをONにする必要があります。(多分ONにすると処理負荷は上がっちゃいます) iPadからPC側に座標を送る iPadからPC(Windows)へはソケット通信(UDP)で座標を送ることにします。 UDP送信にはObjectDelivererを使います。 ObjectDelivererについては過去記事みてください。 まずは送信するための入れ物を作ります。といっても簡単で以下のようなブループリントを定義します。TouchPositionというオブジェクトの名前にしました。 ...

2019-12-28 · 1 分 · 86 文字 · ayumax

UObjectをJsonにシリアライズしよう

この記事はUnreal Engine 4(UE4) Advent Calendar 2019の20日目の投稿記事です。 Unreal Engine 4 (UE4) Advent Calendar 2019 - Qiita 私がマーケットプレイスに公開しているObjectDelivererというプラグインがあります。 今回の記事はこのプラグインに実装している「オブジェクトをJsonにシリアライズする機能」について書きます。 例えばこんなVariablesを定義したブループリント(Objectを継承)があるとすると、 こんな感じのJson文字列に変換されます。 { "IntValue":0, "BoolValue":false, "StringValue":"ABC" } Jsonは文字列で表現されるので、そのままテキストファイルに保存することもできます。 また文字列なので人間の目で見ても中身が分かりやすいです。 このJsonをオブジェクトに復元する機能も作ることで、Jsonを介してオブジェクトの保存-復元ができるようになるのです。 ObjectDelivererではこのJson文字列を通信に乗せて送受信することで、オブジェクトを別の場所(別のアプリケーション)に届けることができています。 UE4におけるJsonの取り扱い UE4には標準でJsonとJsonUtilitiesというモジュールがあります。 Jsonモジュール Jsonの読み書きをサポートするモジュールです。ただしブループリントでは使用できずC++のみサポートされています。 こんな感じで使えます。 Jsonオブジェクト→Json文字列 // FJsonObject(Jsonデータの入れ物)を作成 TSharedPtr&lt;FJsonObject> jsonObject = MakeShareable(new FJsonObject()); // jsonObjectにプロパティを追加 // FStringにJsonを書き込むためのWriterを作成 FString OutputString; TSharedRef&lt;TJsonWriter&lt;>> Writer = TJsonWriterFactory&lt;>::Create(&amp;OutputString); // JsonをFStringに書き込み FJsonSerializer::Serialize(jsonObject.ToSharedRef(), Writer); // OutputStringにJson文字列が入っているので何かする Json文字列→Jsonオブジェクト // json文字列が入っているFString FString jsonString; // FStringからJsonを読み込むためのReaderを作成 TSharedRef&lt;TJsonReader&lt;TCHAR>> JsonReader = TJsonReaderFactory&lt;TCHAR>::Create(jsonString); // FJsonObject(Jsonデータの入れ物)を作成 TSharedPtr&lt;FJsonObject> JsonObject = MakeShareable(new FJsonObject()); // Json文字列からJsonオブジェクトに読み込み FJsonSerializer::Deserialize(JsonReader, JsonObject); // jsonObjectからプロパティを取り出して何かする Jsonオブジェクトの値のGet, Set TSharedPtr&lt;FJsonObject> JsonObject = MakeShareable(new FJsonObject()); // 値のセット JsonObject->SetNumberField("IntValue", 1); JsonObject->SetBoolField("BoolValue", true); JsonObject->SetStringField("StringValue", "ABCDEFG"); // 値の取得 int32 intValue = JsonObject->GetIntegerField("IntValue"); bool boolValue = JsonObject->GetBoolField("BoolValue"); FString stringValue = JsonObject->GetStringField("StringValue"); // このほかArrayやObjectプロパティもGet, Setできます 上記パターンを知っていれば、だいたいのケースで対応できると思います。 ...

2019-12-20 · 2 分 · 355 文字 · ayumax

ObjectDeliverer Ver 1.4.0リリース 送信元IPアドレスの取得機能追加

ObjectDeliverer Ver 1.4.0 数日前の話ですがObjectDelivererの新バージョンをリリースしました。 (ブログ書こうと思って忘れてた) ObjectDeliverer:ayumax:Code Plugins - UE4 マーケットプレイス 送信元IPアドレスの取得機能追加 通信プロトコルをTCP/IP Server もしくはUDP Receiverにしている場合にのみ使用可能な機能です。 これら2つの通信プロトコルでは、送信元が複数のIPアドレスの可能性があります。 ただし以前のバージョンまではどこからの送信だったのかを知るすべがありませんでした。 (TCP/IP Serverには厳密には送信元を区別して認識する機能はありましたが、IPアドレスを知る機能はありませんでした) これはObjectDelivererの設計思想の「異なる通信プロトコルを同じように切り替えて使える」を実現するために、あまり個別のプロトコルに特化した機能は入れたくなかったというのがあります。 ただ現実的にないと困ることもあり、今回実装しました。 以下仕様例です。 ReceiveDataイベントのClientSocketオブジェクトをGetIPV4Infoインターフェイスを通して使うことで情報の取得ができます。 今回追加したGetIPV4InfoインターフェイスにはIPアドレスをuint8の要素数4の配列で取得するGetIPAddressと"...“の文字列形式で取得するGetIPAddressinStringがあります。 対応している通信プロトコル以外ではReceiveDataイベントのClientSocketオブジェクトがGetIPV4Infoインターフェイスを実装していないため、インターフェイスへのキャストで失敗します。 今後もなるべく同じように使えるというコンセプトは崩したくないですが、個別プロトコル固有の機能はインターフェイス経由で使えるようにしていこうと思います。

2019-10-20 · 1 分 · 26 文字 · ayumax

ObjectDeliverer Ver 1.3.0リリース マルチプラットフォーム対応

ObjectDeliverer Ver 1.3.0 本日ObjectDelivererの新バージョンをリリースしました。 ObjectDeliverer:ayumax:Code Plugins - UE4 マーケットプレイス 内容は以下の2点です。 iOS, Android, Macへの対応 UDPReceiverを使用した時にエディタ終了時まれにフリーズする不具合を修正 iOS, Android, Macへの対応 最近個人的にUE4でモバイルアプリの作成を開始したこともあり検証環境ができてきたので、モバイルOSの対応を実施しました。 ただ内部的なコードの変更は何もしておらず、各種OS向けにパッケージを作成したのみとなります。 もともとほとんどの仕組みをUE4のC++クラスのみを利用して作成していたため、今確認できる範囲では各種OSでもちゃんと動作が確認できています。 これによりスマホアプリとデスクトップアプリや、スマホアプリ同士での通信ができるようになるため、プラグインとしての使い勝手が今まで以上に広がると思っています。 UDPReceiverを使用した時にエディタ終了時まれにフリーズする不具合を修正 もう1点は不具合修正になります。 UDPの受信機能を使用している場合に、タイミングが悪いとエディタ終了時にフリーズしてしまう不具合があったため修正しました。 他のプラグインの対応 現状ObjectDeliverer以外のプラグインは全てWindowsのみの対応としていますが、今回の対応で対応方法が分かってきたので、他のプラグインも時期をみてモバイルOSの対応も実施したいと思っています。

2019-07-31 · 1 分 · 26 文字 · ayumax

ObjectDeliverer Ver 1.2.1リリース UDPReceiverの不具合修正

ObjectDelivererのVersion 1.2.1をリリース 今回はユーザーの方よりご指摘いただいた以下の不具合を修正しました。 UDPReceiverで既に使われているポートを指定するとEditorがクラッシュする InnerSocket = FUdpSocketBuilder(TEXT("ObjectDeliverer UdpSocket")) .WithReceiveBufferSize(1024 * 1024) .BoundToPort(BoundPort) .Build(); Receiver = new FUdpSocketReceiver(InnerSocket, FTimespan::FromMilliseconds(10), TEXT("UProtocolUdpSocketReceiver")); Receiver->OnDataReceived().BindUObject(this, &amp;UProtocolUdpSocketReceiver::UdpReceivedCallback); Receiver->Start(); if (InnerSocket) { DispatchConnected(this); } 上記が修正前のソースです。 BoundPortに既に使われているポート番号が指定されると、InnerSocketにはnullptrが入るためその後FUdpSocketReceiverを生成したタイミングでクラッシュしていました。 今回はこれを単純ですが以下のように修正しました。 InnerSocket = FUdpSocketBuilder(TEXT("ObjectDeliverer UdpSocket")) .WithReceiveBufferSize(1024 * 1024) .BoundToPort(BoundPort) .Build(); if (InnerSocket) { Receiver = new FUdpSocketReceiver(InnerSocket, FTimespan::FromMilliseconds(10), TEXT("UProtocolUdpSocketReceiver")); Receiver->OnDataReceived().BindUObject(this, &amp;UProtocolUdpSocketReceiver::UdpReceivedCallback); Receiver->Start(); DispatchConnected(this); } これでFUdpSocketBuilderでの初期化に失敗した場合でも、クラッシュすることはなくなりました。 この不具合を見つけて、同じような仕組みのTCP/IP Serverは大丈夫かと思いましたが、そちらはガードが既にかかっており大丈夫でした。 単純なミスをやらかしてしまい、お恥ずかしいです。

2019-06-25 · 1 分 · 57 文字 · ayumax

ObjectDeliverer v1.2.0リリース

ObjectDelivererのV1.2.0をリリースしました。 変更点は以下の2つです。 PacketRuleNodivisionを使用してUDPの受信を行うと無限ループしてしまう不具合修正 TCP/IPクライアントでサーバーが切断されると自動的に接続を試みるオプション追加 PacketRuleNodivisionを使用してUDPの受信を行うと無限ループしてしまう不具合修正 上記のようにPacketRuleNodivisionを使用してUDPの受信機能を使うと、一度受信したタイミングで無限ループに入ってしまう不具合が起きていましたので修正しました。 UDPの受信はPacketRuleNodivisionを使うことが一番多いと思うので、ホント致命的な不具合で申し訳ないです。 TCP/IPクライアントでサーバーが切断されると自動的に接続を試みるオプション追加 以前からTCP/IPクライアントを利用時にRetryフラグをONにすると、自動でサーバーが起動するまでConnectを繰り返す機能が実装されていました。 ただし、この機能はいったんサーバーと接続確立後にサーバー終了した場合は働かない仕様でした。 そこで今回新たにAutoConnectAfterDisconnectフラグを作成しました。 このフラグをONにすると、接続済みのサーバーとの接続がなくなった場合に自動でConnectを繰り返すようになります。 そのため、従来のRetryフラグを合わせて使うことで、サーバーとつながっていない時はいつでもConnectを繰り返すようになります。 常に接続を確立しておきたいケースに便利です。

2019-06-11 · 1 分 · 14 文字 · ayumax

ObjectDelivererの共有メモリサンプル

共有メモリのサンプル 以前からGitHubにObjectDelivererのサンプルを用意していたのですが、共有メモリについては読み込み側しか実装しておらず処理が完結していなかったので新規で書き込み側も実装しました。 ここではサンプルの内容を簡単に紹介します。 概要 このサンプルではSceneCapture2Dで撮った画像をTexurueRenderTargetから取り出し、そこから共有メモリを経由して別のマテリアルに表示します。 まずはSharedMemoryレベルを開いてください。 全実装はBox Actorブループリント内にあります。 読み込み側の実装 共有メモリから読み込んだピクセルバッファを入れるテクスチャとマテリアルを用意します。 共有メモリの読み込み用ObjectDelivererのインスタンスを生成し処理を開始します。 共有メモリのバッファサイズは画像バッファサイズ(800x450x4 byte)を設定しています。 ReceiveDataイベント(共有メモリの中身に変化があった時におこるイベント)でテクスチャの中身を更新します。 書き込み側の実装 TextureRenderTargetから取得したピクセルバッファを入れておくバッファを用意します。 共有メモリへの書き込み用ObjectDelivererのインスタンスを生成し処理を開始します。 共有メモリのバッファサイズは画像バッファサイズ(800x450x4 byte)を設定しています。 Tickイベント時にTextureRenderTargetからピクセルバッファを取り出し共有メモリに書き込みます。 使い道 この例では1つのプロセス内で完結しているためあまり意味はないですが、 例えばUE4のプロジェクトを2つ用意して、片方は共有メモリへの書き込みを担当し、もう片方は共有メモリからの読み込みを担当することで映像の受け渡しができます。 共有メモリはTCP/IPやUDPと違ってネットワーク経由でのデータの受け渡しはできませんが、その分大容量のデータを高速に渡せるため映像などの重いデータのプロセス間通信に適していると思います。 ご興味ある方はぜひ試してみてください。

2019-06-06 · 1 分 · 25 文字 · ayumax

ObjectDeliverer Ver1.1.0リリース

Unreal Engineのマーケットプレイスに出品(無料)しているコードプラグインのバージョンアップを行いました。 既に最新のプラグインはマーケットプレイスからダウンロードできます。 ObjectDelivererがどんなものかは以下の記事をご覧ください。 ObjectDelivererでUE4のプロセス間通信を簡単に - AYU MAX 更新内容 今回は更新内容は 細かいバグフィックス TCP/IPサーバー利用時に送信先を指定する機能 になります。 バグフィックス ObjectDelivererManagerのStartメソッド時にPacketRuleを渡さない場合にnullアクセスで落ちる不具合を修正しました。 その他、処理の効率化(余分に値のコピーしている箇所の削除)も行っています。 TCP/IPサーバー利用時に送信先を指定する機能 この機能はマーケットプレイスのコンテンツページへの要望コメントにお応えして実装しました。 既存のSendメソッド経由の送信では、 自分がサーバーで複数クライアントが接続されている場合に、全てのクライアントにデータが届いてしまいましたが、これを狙ったクライアントのみに送信できるようにSendToメソッドを追加しています。 ちなみにTCP/IPサーバー以外のプロトコル利用時にSendToメソッドを使った場合はSendメソッドと同等の動きをします。 SendToのサンプル SendToに渡す送り先は、ConnectedイベントやReceiveDataイベントのパラメータとして渡ってきます。 なので、この値を適時保持することで狙ったTCP/IPクライアントへの送信が可能です。 以下のブループリントはReceiveDataの時のパラメータをそのまま使ってSendToしています。 この記述を行うとデータを受信した時に、受信したクライアントにのみ応答送信する実装が可能です。 ご興味ある方はお試しください。

2019-05-03 · 1 分 · 27 文字 · ayumax

ObjectDelivererをUE4 マーケットプレイスにリリースしました

Marketplaceにリリース完了 ここ最近目標にしてきたUE4のマーケットプレイスへの出品が実現できました。 リリースしたのはCodePluginでObjectDelivererといいます。 値段はFreeにしているので、どなたでもご利用いただけます。 ObjectDeliverer by ayumax in Code Plugins - UE4 Marketplace 主にUE4のアプリケーションと他のアプリケーションのプロセス間通信を行うためのライブラリです。 ゲーム開発としてUE4を利用されている方にはあまりマッチしないライブラリかもしれませんが、その他の利用方法をされていて他のアプリケーションと連携したいなあと思っている方には刺さると思います。 私自身は今行っているVRを利用したコンテンツ作りに利用中です。 このライブラリについては別途記事にしていますので、ご興味ある方はご覧ください。 ObjectDelivererでUE4のプロセス間通信を簡単に - AYU MAX リリースまでの履歴 せっかくなのでどんな感じでリリースまでいったかをメモしておきます。 2018/12 UE4向けの通信ライブラリを書こうと思いつき、着手。 どうせならMarketplaceにリリースすることを目標にする。 2019/1 ライブラリ初版完成。自分自身で使って試す。 見つかったバグを一通りつぶす。 2019/2/7 Marketplaceに提出するにはパッケージ化を行う必要があると知り、調査→実施。 UE4 Marketplace用に自作Pluginのパッケージを作る - AYU MAX 2019/2/10 Marketplaceに販売者登録を行い、作成したパッケージを登録する。 記入事項があっているか不安になりながらも一通り完了。 登録後のメールでは審査完了まで15から20営業日かかるよと書かれていた。 UE4 Marketplaceに出品する - AYU MAX 2019/2/16 メールが届き、5営業日以内にレビューするよとの事。 1か月くらいは待つつもりだったので、少しびっくり。 2019/2/18 レビューが終わって、少し手直しが必要とのこと。 具体的にはC++のソースの先頭にCopyrightを記入してと指摘があった。 また*.upluginファイルにMarketplaceURLを記述して、再度ファイルを登録してほしいとの事。 即日、修整を実施し再度登録を行った。 2019/2/19 3から5営業日中に最終レビューに進むと連絡があった。 2019/2/19 日付が変わる直前にメールがあり、ステータスがAPPROVEDになったとの事。 あとは自分で製品ページにログインしてステータスをPUBLISHEDに変更してねとあった。 即実施し、無事にリリース完了。 Epic Game Launcherで確認すると確かにあった!! がんばったらリリースできた 何かのストアにリリースするのは数年前にiOSのアプリを作ったきりだったので、とても楽しかった。 何より達成感があります。 長くなりそうだと思っていたレビューも結果的に10日で終わっているので全然待てたし、何よりリジェクトされなくてホッとしました。 レビューしてくれたEpicの方ありがとうございます。 とはいえ、ライブラリはストアにリリースしてからがスタートともいえるのでちゃんとメンテナンスしていきたいと思います。 まだ、あと2,3個ネタが頭の中にあるので、またリリースできたら良いなあ。

2019-02-20 · 1 分 · 69 文字 · ayumax