このページでは 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 プラグインをインストールする必要があります。
ステップ
-
Unreal Editor で Web Remote Control を利用するプロジェクトを開きます。
-
メイン メニューから [Edit (編集)] > [Plugins (プラグイン)] を選択し、 [Plugins (プラグイン)] ウィンドウを開きます。
-
[Plugins (プラグイン)] ウィンドウで、[Messaging] カテゴリから [Remote Control API] プラグインを見つけます。[Enabled (有効にする)] にチェックを入れます。
-
このプラグインがベータ版であることを示す警告が表示されたら、 [Yes (はい)] をクリックして了承します。
-
[Restart Now (すぐに再起動)] をクリックして Unreal Editor を再起動し、プロジェクトを再度開きます。
最終結果
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 サーバーが自動的に開始します。 |
ここでは、エディタのメイン ウィンドウでサーバーを起動します。
ステップ
-
メイン メニューから [Window (ウィンドウ)] > [Developer Tools (デベロッパーツール)] > [Output Log (アウトプットログ)] を選択します。
-
[Cmd] バーにコンソール コマンド
WebControl.StartServer
を入力します。 -
サーバーが実行中であることを示すメッセージが表示されます。
最終結果
サーバーが起動されたので、リクエストをサーバーに送信できるようになりました。
3 - リクエストを送信する
最初のリクエストには、できる限りシンプルなユース ケースを使用することをお勧めします。
-
Insomnia や Postman など、API リクエストと API レスポンスのテスト専用のツールを使用します。専用のツールを使うことで、リクエストの JSON ペイロードを正しく作成できていることを確認しやすくなります。Web Remote Control エンドポイントの動作や、エンドポイントから返される各種レスポンスに慣れたら、独自の Web アプリケーションにエンドポイントへの呼び出しを組み込みましょう。
-
最初は、エディタでプロジェクトを実行しているコンピュータ上で、ローカルにリクエストを送ります。問題なく機能することを確認できたら、ローカル ネットワークに接続している他のコンピュータやデバイス上のクライアントからリクエストを送信します。
ステップ
-
Web クライアント アプリで、ボディに次のコードを設定したリクエストを作成します。
{ "objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightSource_0.LightComponent0", "access":"READ_ACCESS", "propertyName":"RelativeRotation" }
このリクエストは、ワールドアウトライナー の Light Source という名前のアクタである、レベルのメインのディレクショナルライトの
RelativeRotation
プロパティに現在設定されている値を要求します。 -
PUT
リクエストでメッセージを次のエンドポイントに送信します。http://localhost:30010/remote/object/property
-
また、Web クライアントには、リクエストしたステータス コードと情報を含むレスポンスが表示されます。
{ "RelativeRotation": { "Pitch": -66.3094, "Yaw":7.72808, "Roll": -6.48224 } }
-
Light Source アクタを選択し、 [Details (詳細)] パネルを確認すると、パネルに表示される値とレスポンスの値が同じであることがわかります。
これは Web Remote Control システムが、どのようにオブジェクト (ここでは、ベクター) を分解して、Web アプリケーションと交換する JSON 値に変換するかを示しています。
-
次は、ライトの回転をリモートで変更します。
このプロパティは 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);
-
ボディに次のコードを設定したリクエストを作成します。
{ "objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightSource_0.LightComponent0", "functionName":"SetRelativeRotation", "parameters": { "NewRotation": { "Pitch":90, "Yaw":0, "Roll":0 } }, "generateTransaction":true }
-
PUT
リクエストでメッセージを次のエンドポイントに送信します。http://localhost:30010/remote/object/call
レベル内の指向性ライトの角度が変わり、シーンのオブジェクトがシャドウ (影) に入っています。
この時点で手順 2 に戻り、同じリクエストを送信すると、今度は先ほど設定した新しい値が返されます。
-
リモートでもう 1 つ関数を呼び出して空を更新し、新しい太陽の角度が考慮されるようにします。ここでは、ブループリントの BP_Sky_Sphere クラスに定義されている関数を呼び出します。
この関数では、 SkySphereBlueprint アクタの [Details (詳細)] パネルで [Refresh Material (マテリアルを更新)] のチェック ボックスをオンにした場合と同じ効果が得られます。
-
次のメッセージを上記と同じエンドポイントに送信します。
{ "objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.SkySphereBlueprint", "functionName":"RefreshMaterial", "generateTransaction":true }
ここでは、関数に入力パラメータが必要ないため、
parameters
プロパティは完全に省略できます。レベルの空が夜に変わります。
最終結果
上記の手順により、実行中の 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