Web Remote Control クイック スタート

Web ページからリモートで Unreal Editor を操作するための手順を詳しく説明します。

Windows
MacOS
Linux

このページでは、Web Remote Control システムの利用を開始するための詳しい手順を紹介します。このチュートリアルを終了すると、Web アプリケーションからの着信要求をリッスンするようにプロジェクトを設定する方法を習得し、独自のリクエストを送信できるようになります。

前提条件:

  • Web Remote Control サーバーは HTTP リクエストを 8080 でリッスンします。ローカル ネットワークからのトラフィックを受信できるように、このポートを確実に開放しておいてください。(このポートは現在は構成できません。)

  • Web クライアントから HTTP サーバーのエンドポイントに JSON ペイロードを含むリクエストを送る方法について、基本レベルの知識が必要です。

  • このページの手順では、 ブループリントの「サードパーソン」 テンプレートからセットアップしたプロジェクトを使用します。基本的にこれと同じ手順をどのプロジェクトでも使用できます。ただし、このテンプレートと同じ空の設定を使用していないプロジェクトでは、手順 「3 - リクエストを送信する」 で指定しているオブジェクト パスとリクエストが機能しない可能性があります。

Unreal Engine アプリケーションのホスト名とポートをオープンなインターネットに公開しないでください。 公開すると、プロジェクトとコンピュータが第三者からの悪意のある行為の被害に遭う可能性があります。

Web Remote Control システムは、ローカル エリア ネットワーク (LAN) か、安全な仮想プライベート ネットワーク (VPN) でのみ使用することを想定しています。

1 - プロジェクトをセットアップする

Web Remote Control のリクエストを送るには、 Remote Control プラグインをインストールする必要があります。

手順

1.Unreal Editor で Web Remote Control を利用するプロジェクトを開きます。

2.メイン メニューから [Edit (編集)] > [Plugins (プラグイン)] を選択し、 [Plugins (プラグイン)] ウィンドウを開きます。

3.[Plugins (プラグイン)] ウィンドウで、 [Virtual Production (バーチャル プロダクション)] カテゴリの [Remote Control (リモート コントロール)] プラグインを見つけます。[Enabled (有効)] チェックボックスをオンにします。

![Remote Control プラグインの有効化](plugin-enable.png "Remote Control プラグインの有効化")

2.このプラグインがベータ版であることを示す警告が表示されたら、 [Yes (はい)] をクリックして了承します。

3.[Restart Now (すぐに再起動)] をクリックして Unreal Editor を再起動し、プロジェクトを再度開きます。

![プロジェクトの再起動](plugin-restart.png "プロジェクトの再起動")

最終結果

Unreal Editor でプロジェクトを再度開くと、Web Remote Control サーバーを起動できるようになります。

2 - サーバーを管理する

Web Remote Control システムは、Unreal Editor プロセスによって起動および管理される Web サーバーに依存しています。セキュリティのため、このサーバーは明示的にアクティベートしなければ、実行されません。サーバーの実行を制御するには、以下のシンプルなコンソール コマンドを使用します。

コマンド

説明

WebControl.StartServer

Web サーバーを起動し、ポート 8080 で着信リクエストのリッスンを開始します。

WebControl.StopServer

Web サーバーを停止し、これ以上 Unreal Editor インスタンスへのリクエストが処理されないようにします。

WebControl.EnableServerOnStartup

当該プロジェクトが Unreal Engine で、次のサポートされるモードのいずれかで開かれた場合に、Web サーバーを自動的に起動します。Unreal Editor のメイン ウィンドウ、プレイ イン エディタ (PIE) セッション、Unreal Editor の -game モード。

ここでは、エディタのメイン ウィンドウでサーバーを起動します。

手順

1.メイン メニューから [Window (ウィンドウ)] > [Developer Tools (デベロッパーツール)] > [Output Log (アウトプットログ)] を選択します。

2.[Cmd] バーにコンソール コマンド「WebControl.StartServer」を入力します。

![サーバーを起動](start-server.png "サーバーを起動")

3.サーバーが実行中であることを示すメッセージが表示されます。

![Web Remote Control サーバーの起動完了](server-running.png "Web Remote Control サーバーの起動完了")

最終結果

サーバーが起動されたので、リクエストをサーバーに送信できるようになりました。

3 - リクエストを送信する

最初のリクエストには、できる限りシンプルなユース ケースを使用することをお勧めします。

  • InsomniaPostman など、API リクエストと API レスポンスのテスト専用のツールを使用します。専用のツールを使うことで、リクエストの JSON ペイロードを正しく作成できていることを確認しやすくなります。Web Remote Control エンドポイントの動作や、エンドポイントから返される各種レスポンスに慣れたら、独自の Web アプリケーションにエンドポイントへの呼び出しを組み込みましょう。

  • 最初は、エディタでプロジェクトを実行しているコンピュータ上で、ローカルにリクエストを送ります。問題なく機能することを確認できたら、ローカル ネットワークに接続している他のコンピュータやデバイス上のクライアントからリクエストを送信します。

手順

1.Web クライアント アプリで、ボディに次のコードを設定したリクエストを作成します。

    {
        "objectPath" :"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightSource_0.LightComponent0",
        "access":"READ_ACCESS",
        "propertyName":"RelativeRotation"
    }

このリクエストは、レベルにあるメインの指向性ライトの <code>RelativeRotation</code> プロパティに現在設定されている値を要求します。この指向性ライトは、 **[World Outliner (アウトライナ)]** では **[Light Source (光源)]** という名前のアクタが該当します。

1.PUT リクエストでメッセージを次のエンドポイントに送信します。

    http://localhost:8080/remote/object/property

1.リクエストを受信して処理したことを示す Web Remote Control サーバーからのメッセージと Web Remote Control サーバーが返したステータス コードが、 [Output Log (アウトプットログ)] コンソールに表示されます。

![サーバーのレスポンスが表示された [Output Log (アウトプットログ)]](output-log-response.png "サーバーのレスポンスが表示された [Output Log (アウトプットログ)]")

また、Web クライアントには、リクエストした情報を保持したレスポンス ボディが表示されます。

    {
        "RelativeRotation":{
            "Pitch":-66.3094,
            "Yaw":7.72808,
            "Roll":-6.48224
        }
    }

1.Light Source (光源) アクタを選択し、 [Details (詳細)] パネルを確認すると、パネルに表示される値とレスポンスの値が同じであることがわかります。

![指向性ライトのコンポーネントのトランスフォーム](light-component-transform.png "指向性ライトのコンポーネントのトランスフォーム")

[REGION:tip]
これは Web Remote Control システムが、どのようにオブジェクト (ここでは、ベクター) を分解して、Web アプリケーションと交換する JSON 値に変換するかを示しています。
[/REGION]

1.次は、ライトの回転をリモートで変更します。

このプロパティは Unreal Engine のソース コードでは <code>BlueprintReadOnly</code> として定義されています。

    /** 親を基準としたコンポーネントの相対的回転 */
    UPROPERTY(EditAnywhere, BlueprintReadOnly, ReplicatedUsing=OnRep_Transform, Category=Transform)
    FRotator RelativeRotation;

したがって、このオブジェクトを変更するには、このオブジェクトが公開する <code>BlueprintCallable</code> 関数を呼び出す必要があります。この定義は <code>Engine/Source/Runtime/Engine/Classes/Components/SceneComponent.h</code> ファイルにあります。

    /**
     * 親を基準としたコンポーネントの相対的回転を設定します
     * @param NewRotation       親を基準としたコンポーネントの相対的回転の新しい値
     * @param SweepHitResult    Sweep が true の場合にヒット (衝突) の衝撃から受けた結果。
     * @param bSweep            目標位置までスイープするかどうか (現在、回転はサポートしていません)。
     * @param bTeleport         物理的ステートをテレポートするかどうか (このオブジェクトで物理コリジョンが有効である場合)。
     *                          true の場合、このオブジェクトの物理速度は変わりません (したがって、ラグドール部分は位置の変化に影響されません)。
     *                          false の場合、位置の変化に応じて物理速度が更新されます (ラグドール部分に影響します)。
     */
    UFUNCTION(BlueprintCallable, Category="Utilities|Transformation", meta=(DisplayName="SetRelativeRotation", ScriptName="SetRelativeRotation", AdvancedDisplay="bSweep,SweepHitResult,bTeleport"))
    void K2_SetRelativeRotation(FRotator NewRotation, bool bSweep, FHitResult& SweepHitResult, bool bTeleport);
    void SetRelativeRotation(FRotator NewRotation, bool bSweep=false, FHitResult* OutSweepHitResult=nullptr, ETeleportType Teleport = ETeleportType::None);
    void SetRelativeRotation(const FQuat& NewRotation, bool bSweep=false, FHitResult* OutSweepHitResult=nullptr, ETeleportType Teleport = ETeleportType::None);

2.ボディに次のコードを設定したリクエストを作成します。

    {
        "objectPath" :"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightSource_0.LightComponent0",
        "functionName":"SetRelativeRotation",
        "parameters":{
            "NewRotation":{
                "Pitch":90,
                "Yaw":0,
                "Roll":0
            }
        },
        "generateTransaction":true
    }

3.PUT リクエストでメッセージを次のエンドポイントに送信します。

    http://localhost:8080/remote/object/call

レベル内の指向性ライトの角度が変わり、シーンのオブジェクトがシャドウ (影) に入っています。

![指向性ライトの角度が変化](light-rotation-changed.png "指向性ライトの角度が変化")

[REGION:tip]
この時点で手順 2 に戻り、同じリクエストを送信すると、今度は先ほど設定した新しい値が返されます。
[/REGION]

4.リモートでもう 1 つ関数を呼び出して空を更新し、新しい太陽の角度が考慮されるようにします。ここでは、ブループリントの BP_Sky_Sphere クラスに定義されている関数を呼び出します。

[REGION:lightbox]
[![BP_SkySphere RefreshMaterial 関数](skysphere-refresh-function.png "BP_SkySphere RefreshMaterial 関数")(w:800)](skysphere-refresh-function.png)
*クリックしてフルサイズで表示*
[/REGION]

[REGION:tip]
この関数では、 **SkySphereBlueprint** アクタの **[Details (詳細)]** パネルで **[Refresh Material (マテリアルを更新)]** のチェック ボックスをオンにした場合と同じ効果が得られます。
[/REGION]

5.次のメッセージを上記と同じエンドポイントに送信します。

    {
        "objectPath" :"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.SkySphereBlueprint",
        "functionName":"RefreshMaterial",
        "generateTransaction":true
    }

[REGION:tip]
ここでは、関数に入力パラメータが必要ないため、 <code>parameters</code> プロパティは完全に省略できます。
[/REGION]

レベルの空が夜に変わります。

![更新された空のマテリアル](sky-updated.png "更新された空のマテリアル")

最終結果

上記の手順により、実行中の Unreal Engine プロジェクトのコンテンツについての情報を Web クライアントから取得する方法を学習しました。また、Web クライアントからリクエストを発行して、Editor 環境内のオブジェクトが公開する関数を実行することで、プロジェクトのコンテンツをリモートで変更する方法も学習しました (ここでは、空を変更しました)。

リモート制御によるライトと空の変更

4 - 応用編

上記のシンプルな手順で使用した 2 つのエンドポイントと同じものを使用して、プロジェクトのコンテンツを広範にわたり詳細に変更できます。これらの使い方については、他にも知っておくべき情報が多くあります。 「エンドポイント リファレンス」 を参照し、詳細とサンプルを確認してください。

Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信