Remote Control クイック スタート

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

このページでは Remote Control API を始めるための段階的な操作方法を説明します。このチュートリアルを終了すると、Web アプリケーションからの着信要求をリッスンするようにプロジェクトを設定する方法を習得し、独自のリクエストを送信できるようになります。

前提条件:

  • Remote Control API サーバーは受信する HTTP リクエストをポート 30010 でリッスンします。このポートが利用できない場合は、[Project Settings (プロジェクト設定)][Web Remote Control] セクションの [Remote Control HTTP Server Port] を変更することができます。

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

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

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 (プラグイン)] ウィンドウで、[Messaging] カテゴリから [Remote Control API] プラグインを見つけます。[Enabled (有効にする)] にチェックを入れます。

    Enable the Remote Control API Plugin

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

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

    Restart the Project

最終結果

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

2 - サーバーを管理する

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

コマンド

説明

WebControl.StartServer

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

WebControl.StopServer

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

WebControl.EnableServerOnStartup

このプロジェクトが Unreal Engine の中でサポートされているモード (メインの Unreal Editor ウィンドウ、Play In Editor (PIE) セッション、Unreal Editor の -game モード) で開かれると web サーバーが自動的に開始します。

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

ステップ

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

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

    Start the Server

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

    Web Remote Control server started

最終結果

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

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"
        }

    このリクエストは、ワールドアウトライナーLight Source という名前のアクタである、レベルのメインのディレクショナルライトの RelativeRotation プロパティに現在設定されている値を要求します。

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

        http://localhost:30010/remote/object/property
  3. また、Web クライアントには、リクエストしたステータス コードと情報を含むレスポンスが表示されます。

        {
            "RelativeRotation": {
                "Pitch": -66.3094,
                "Yaw":7.72808,
                "Roll": -6.48224
            }
        }
  4. Light Source アクタを選択し、 [Details (詳細)] パネルを確認すると、パネルに表示される値とレスポンスの値が同じであることがわかります。

    Directional Light Component Transform

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

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

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

        /** Rotation of the component relative to its parent */
        UPROPERTY(EditAnywhere, BlueprintReadOnly, ReplicatedUsing=OnRep_Transform, Category=Transform)
        FRotator RelativeRotation;

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

        /**
         * Set the rotation of the component relative to its parent
         * @param NewRotation       New rotation of the component relative to its parent
         * @param SweepHitResult    Hit result from any impact if sweep is true.
         * @param bSweep            Whether we sweep to the destination (currently not supported for rotation).
         * @param bTeleport         Whether we teleport the physics state (if physics collision is enabled for this object).
         *                          If true, physics velocity for this object is unchanged (so ragdoll parts are not affected by change in location).
         *                          If false, physics velocity is updated based on the change in position (affecting ragdoll parts).
         */
        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);
  6. ボディに次のコードを設定したリクエストを作成します。

        {
            "objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightSource_0.LightComponent0",
            "functionName":"SetRelativeRotation",
            "parameters": {
                "NewRotation": {
                    "Pitch":90,
                    "Yaw":0,
                    "Roll":0
                }
            },
            "generateTransaction":true
        }
  7. PUT リクエストでメッセージを次のエンドポイントに送信します。

        http://localhost:30010/remote/object/call

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

    Directional Light angle changed

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

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

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

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

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

    ここでは、関数に入力パラメータが必要ないため、parameters プロパティは完全に省略できます。

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

    Sky material updated

最終結果

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

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

4 - 応用編

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

Web サーバーのアドレスはデフォルトでは 127.0.0.1 に設定されています。これは Unreal Engine セッションを実行する端末のみアクセスすることができます。他のデバイスから Remote Control API を使って Unreal セッションにアクセスできるようにするには、プロジェクトの DefaultEngine.ini ファイルを端末の IP アドレスに変更します。

    [HTTPServer.Listeners]
    DefaultBindAddress=0.0.0.0
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル