このリポジトリは Unreal Engine プロジェクト本体ではなく、Plugins/ 配下の WebUI 関連 Plugin のみを管理します。
- Author: Hironori Sugino
- Website: https://sugi.cc
- Original Repository: https://github.com/sugi-cho/UE_WebUIRuntime_Plugins
WebUIRuntime- Core Runtime Plugin
- Actor / Component の Web UI 化、schema API、property 変更、button event の基盤
WebUI_NDIWebUIRuntimeの拡張 Plugin- NDI source picker など、NDI 連携用の追加機能
- Unreal Engine プロジェクトの
Plugins/にこのリポジトリの Plugin を配置します。 - 対象プロジェクトの
.uprojectでWebUIRuntimeと必要ならWebUI_NDIを有効化します。 - Project Settings の
Plugins > Web UI RuntimeでPortを設定します。 - 同じ画面の
Allow Remote Accessを有効にすると、LAN 内の端末からもアクセスできます。 WebUIHostComponentを持つ Actor を配置して Web UI を起動します。- UE 内に埋め込み表示したい場合は、
Web Browser Widgetプラグインも有効化します。
複数の Actor が WebUIHostComponent を持つ場合、Web UI は WebUIId ごとのタブで切り替えます。
タブ名は WebUIId を使います。
タブ下の説明には WebUIHostComponent の Description を表示します。
WebUI に出すボタンやパラメータは、名前の先頭に 00_ のようなプレフィックスを付けて管理します。
WUI00_ のような互換プレフィックスも同じく並び順として扱えます。
数字部分は並び順に使われ、表示時はプレフィックスを除いた名前だけが UI に出ます。
- Web UI の起動と集約を担当します。
- Actor ごとの識別子として
WebUIIdを持ちます。 - タブ説明用の
Descriptionを持ちます。 WebUIIdが未設定なら Actor 名を使います。- ポートは個別設定ではなく、Project Settings の 1 設定を使います。
Allow Remote Accessを有効にすると、HTTPServer の bind をanyにして LAN 内から見えるようにします。
WebUIHostComponentを内包した Actor です。- まずは
WebUIHostActorを置く運用を推奨します。 - Actor 側の
WebUIId/Description/bAutoStartServerを使い、内部でWebUIHostComponentを同期します。 - 既存 Actor に後付けしたい場合は、従来どおり
WebUIHostComponent単体でも使えます。 - ボタンは
WebUIHostComponent側を上段コントロールとして使います。
- 実際の UI 要素は
WebUIComponentBaseか、その派生クラスに置きます。 WebUIComponentBaseはそのまま使ってもよいですし、独自の Component を作って継承しても使えます。- たとえば NDI 用の
WebUINDIComponentのように、用途ごとに派生 Component を追加できます。 WebUIHostComponentを持つ Actor には、Actor 自身のWebUI変数も上段に表示され、その下に Component ごとのセクションが並びます。WebUIHostComponentのボタンは、Actor セクション内の共通コントロールとして表示されます。- WebUI に出す対象は
WUI00_などの名前規則で判定します。
WebUIImageComponent を追加すると、Web UI で画像を表示できます。
- Actor に
WebUIImageComponentを追加します。 SourceTextureに表示したいTexture2DかRenderTargetを設定します。WebUIImageSlotで表示先を選びます。bForceOpaqueRenderTargetImageは、RenderTarget の alpha を不透明にしたいときだけ使います。
Preview- タブ上段のプレビュー領域に表示します。
Icon- タブ見出しのアイコンとして表示します。
Inline- コンポーネントのプロパティ欄の直後に表示します。
Texture2D- HTTP 経由で静的画像として配信します。
RenderTarget- WebSocket 経由でフレーム配信します。
MediaTexture- HTTP 経由で定期更新します。
- 再生前は透明画像を返し、準備ができたら自動的に表示します。
NDIWebUI_NDIを有効にすると、NDIMediaTexture2DもWebUIImageComponentのSourceTextureとして扱えます。- NDI テクスチャは内部的にフレーム読み出しして表示します。
RenderTargetは WebSocket 配信を使うため、WebUIRuntimeのWebSocketPortが有効である必要があります。- WebSocket の購読は接続ごとに管理されます。
- クライアントはタブ切替時に、現在の
WebUIIdと表示中の画像キーをsubscribeで送り直します。 - 再接続直後は
snapshotRequestを送って、最新フレームを再取得します。 - 購読していない
WebUIIdの RenderTarget フレームは送られません。 - NDI 画像を使う場合は、
WebUI_NDIとNDIIOPluginの両方を有効化してください。 - NDI 側の受信先は
WebUINDIComponentのTargetNDIMediaReceiverで指定します。 WebUINDIComponentのSelectedNDISourceに表示したい Source 名を入れると、UNDIMediaReceiverのConnectionSettingに反映されます。- 初回接続時は
Initialize(ConnectionInfo, Standalone)、既存接続がある場合はChangeConnection(ConnectionInfo)を呼びます。 SetTargetNDIMediaReceiver(UNDIMediaReceiver)を使うと、Blueprint から受信先を差し替えられます。- 画像が表示されない場合は、
SourceTextureが正しく設定されているか、WebUIIdが一致しているかを確認してください。
- 対象の
UPROPERTY名を00_のような形式にします。 WUI00_のような形式も互換として使えます。- 数字は並び順に使われます。
- 表示名はプレフィックスを除いた部分になります。
- 対応型の値だけが WebUI に出ます。
- 数値型は
UIMin/UIMaxやClampMin/ClampMaxがあればスライダーとして表示されます。 Editor ではSync WebUI Presentation For Blueprintで保存済み presentation に同期できます。Packaged build では保存済み data を使います。 enumは選択肢のドロップダウン、Vector/Rotatorは成分ごとの数値入力です。Colorはカラーピッカー、LinearColorはカラーピッカー+RGBA 数値入力で表示されます。
WebUIRuntime が現在対応している UPROPERTY の型は次のとおりです。
boolint32float/doubleFString/FName/FTextenumFVectorFRotatorFColorFLinearColor
JSON での入力例:
{
"bool": true,
"int32": 42,
"float": 1.5,
"string": "hello",
"enum": "ValueName",
"vector": { "x": 1, "y": 2, "z": 3 },
"rotator": { "pitch": 10, "yaw": 20, "roll": 30 },
"color": { "r": 1, "g": 0.5, "b": 0, "a": 1 },
"linearColor": { "r": 0.2, "g": 0.4, "b": 0.6, "a": 1 }
}TArray / TMap / TSet / 任意の UStruct / オブジェクト参照は、この実装では対象外です。
Blueprint 側の例:
00_Brightness01_Tint
WebUI 上で値を変更すると、UE 側の変数が更新され、その後 OnWebUI...Changed 系イベントが呼ばれます。
WebUIComponentBaseか派生 Component でRegisterWebUIButton("00_ButtonName")を呼びます。WUI00_のような形式も互換として扱えます。- 数字は並び順に使われ、表示時は取り除かれます。
WebUIHostActorから呼んだ場合も、内部のWebUIHostComponentのボタンとして扱われます。OnWebUIButtonClicked(ButtonId)を実装して押下処理を書きます。
RegisterWebUIButton(TEXT("00_Apply"));
RegisterWebUIButton(TEXT("01_Reset"));Button は Property と同じく WebUI に表示され、クリックで UE 側のイベントに戻ります。
UWebUIRuntimeBrowserWidget を使うと、既存の WebUI を WebBrowserWidget 経由で UE 内の UMG として表示できます。
- Widget Blueprint を作成し、親クラスに
WebUIRuntimeBrowserWidgetを指定します。 - そのまま配置しても動作します。必要なら BP 側で
WebBrowserを配置して見た目を調整できます。 bAutoLoadOnConstruct=trueの場合、Construct 後に自動でLoadWebUI()します。- 手動で再読込したい場合は
ReloadWebUI()を呼びます。
LoadWebUI()ReloadWebUI()SetWebUIId(FString InWebUIId)SetUseEmbedMode(bool bInUseEmbedMode)SetOverrideURL(FString InOverrideURL)GetWebUIURL()
bAutoLoadOnConstructbUseEmbedModebSupportsTransparencyWebUIIdAdditionalQueryStringOverrideURLbPreferLocalhost
OverrideURLが空でない場合はそれを優先します。- 通常は
http://127.0.0.1:{Port}/webui/を使います。 bUseEmbedMode=trueの場合、embed=1を付けます。WebUIIdがある場合、webuiId={WebUIId}を付けます。AdditionalQueryStringがある場合、そのまま追加します。
URL 例:
http://127.0.0.1:8080/webui/?embed=1http://127.0.0.1:8080/webui/?embed=1&webuiId=LightControllerhttp://127.0.0.1:8080/webui/?embed=1&webuiId=LightController&compact=1
- UE 内埋め込み表示向けの軽量レイアウトに切り替えます。
html/bodyの余白を抑え、背景を透明寄りにします。- 外部ブラウザ向けの大きなヘッダーや余白を非表示にします。
- Property UI と Button UI はそのまま維持します。
bSupportsTransparencyを有効にすると、WebBrowserWidget側で透過表示を試みます。embed=1時は HTML 側も透明背景寄りにします。- ただし、プラットフォームやレンダラー設定によっては完全な透過にならない場合があります。
- Widget の
NativeConstruct時点で HTTPServer が未起動でも、クラッシュしないようにしています。 - 未起動時はログを出し、数回だけ再試行します。
- 後から
ReloadWebUI()を呼べば再接続できます。
- 外部ブラウザ向けの通常表示はそのまま残っています。
embed=1は UMG 内表示専用の追加モードです。webuiIdクエリを付けると、初期表示タブを指定できます。
WebUI_NDIはNDIIOPluginを前提にします。NDIIOPluginはこのリポジトリでは管理しません。- 運用時は Unreal Engine プロジェクトの
Plugins/NDIIOに配置してください。 - 公式 SDK は Project
Plugins/と EnginePlugins/の両方に入れられますが、このリポジトリでは ProjectPlugins/前提で扱います。 - 公式 SDK はこちらです: NDI Unreal Engine SDK
- このリポジトリでは UE 5.7 向けの
NDIIOPluginを想定しています。 WebUI_NDIを有効にすると、NDIMediaTexture2DをWebUIImageComponentで表示できます。WebUINDIComponentではNDIMediaReceiverを直接持たせて NDI Source を切り替えます。TargetNDIMediaReceiverが未設定なら runtime で transient なNDIMediaReceiverとNDIMediaTexture2Dを自動生成します。On WebUI NDI Source Selectedは Details のEventsから受け取れます。NDIReceiverComponentは不要です。- 5.7 以外の Unreal Engine では、そのままでは動作しない可能性があります。
Web Browser Widgetプラグインが無効だと UE 内表示は利用できません。- Shipping ビルドや各プラットフォームでの WebBrowserWidget の挙動は、別途検証が必要です。
Allow Remote Accessを有効にすると、LAN 内の端末から操作 API にアクセスできます。運用環境ではアクセス制御に注意してください。- この変更では
WebUI_NDIの既存挙動は変更していません。 WebUIRuntimeEditorのSync WebUI Presentation For Blueprintで、Blueprint や C++UPROPERTYのDisplayName/ToolTip/UIMin/UIMax/ClampMin/ClampMaxを保存済み presentation に同期できます。- エディタ上部ツールバーの
WebUI Sync Allで、プロジェクト内の Blueprint をまとめて同期できます。