※この記事で使用しているUnrealのVersionは04.27.0 Preview2です。

※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト

最近は少々プライベートやお仕事が色々忙しかったのでの都合で更新を休んでいましたが、適度にブログ更新していきますよ!

UE4の起動引数について レベル【★★★】

起動引数についての説明は、以下のリンクをご覧ください。

コマンドライン引数

引数は、Unrealで定義されているものをつけると、そのコマンドにあった処理や設定が有効になったりしますが、この引数は、独自のものも定義することができ、その定義した引数を取得することができます。

起動引数を使うと、通常起動時には走らせたくない処理を、特定の起動引数をつけて起動することで処理を開始させることができるので、プロジェクトの効率化にとても役に立つと思います。

下準備

UE4エディターを起動引数付きで起動する方法はいくつかありますが、個人的なおすすめはバッチを作っちゃうのが簡単でいいかなと思います。

作り方は、まずExplorer上の「.uproject」があるフォルダ内にテキストファイルを作成します。

作成したファイルの拡張子を「.bat」にしてあげます。

※Exploler上部の「表示」から「ファイル名拡張子」にチェックを入れておくと、拡張子ごと名前を変更できます。

こうすることで、バッチファイルを作成することができます。

UE4内でコマンド引数を取得する際は、Blueprintの「UKismetSystemLibrary::GetCommandLine()」という関数でStringで取得することができます。

(詳しくは以下をご覧ください)

[UE4] Blueprint上でコマンドライン引数の値を取得する

ちなみに、Editor自体の起動引数を使いたいので、上記に乗っているEditorPreferenceの「Additional Launch Parameters」に引数を設定しても、エディター上では取得できませんので、上記で説明したバッチ等のやり方でエディターを起動して引数をつけましょう。

尚、ありがたいことにUE4.26.2現在では上記のサイトでは、自作でごり押していたCommandLineをParseする「UKismetSystemLibrary::ParseCommandLine()」という関数が追加されています。

上記関数は、具体的な使い方と一緒に説明をしていきます。

エディターの起動引数とEditorUtilityで自動化されたスクリプトを実行してみる レベル【★★★】

それでは、実際に起動引数付きでUE4エディターを起動させて、Blueprintで引数の値を取得してみます。

冒頭で説明した、batの作成方法で、プロジェクトフォルダの「.uproject」があるフォルダにbatファイルを作成します。

そして、右クリックを押して「編集」を押して、メモ帳などでbatの中身を書いていきます。

@echo off
echo 起動引数付きでエディターを起動します
"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UE4Editor.exe" "%CD%\KA_StartArg.uproject"  Token_01 -Switch_01 -ParamKey_01=ParamValue_01

“C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UE4Editor.exe”
この部分に関しては、UE4をインストールした際の「UE4Editor.exe」があるパスを指定します。

“%CD%\KA_StartArg.uproject”
この部分に関しては、「%CD%」部分はbatファイルがおかれているパスがそのまま代入されるので、その後の文字をそれぞれのプロジェクト名.uprojectを指定してあげます。

ひとまず、

Token_01
-Switch_01
-ParamKey_01=ParamValue_01

という3つの引数をつけておきます。

できましたら保存して、作成したバッチをダブルクリック等して、バッチを起動しましょう。

すると、通常起動と同じようにUnrealEditorが立ち上がるかと思います。

では、ひとまずTest用にEditorUtilityWidgetを作ります。

ContentBrowser左上の「Add/Import」から、「Editor Utilities」→「EditorUtilityWidget」を選択して作成します。

作成したら、ダブルクリックで開いて編集します。

Designerモードでは、適当にButtonWidgetを配置しましょう。

できたら、右上のGraphボタンを押してGraphモードに移行し、Blueprintを書いていきます。

冒頭で紹介した「GetCommandLine」で引数の値を取得し、「ParseCommandLine」で、引数をいくつかの種類に値を仕分けします。

ParseCommandLineで返される値は、以下のように仕分けられます。

OutTokens   引数の最初に「-」がつけられていない文字列の配列
OutSwitches 引数の最初に「-」がつけられている文字列の配列
OutParams   引数の最初に「-」がつけられていて、「A=B」の形になっている文字列のA側がKey,B側がValueの連想配列

作成できたら、一旦EditorUtilityWidgetのエディタを閉じ、ContentBrowser上のEditorUtilityWidgetを右クリック→「Run Editor Utility Widget」を選択してクリックします。

こんな感じで、起動時に設定した引数をBlueprintで取得することができました。

では、具体的にどのような使い道があるでしょうか?

EditorUtilityには、「エディターを起動時にEditorUtilityを実行する」という機能が存在します。

(以下に詳しく乗っているのでご覧ください)

エディタの起動時にブループリントを実行する

これは、「EditorUtilityBlueprint」の「Run」イベントを、エディター起動時に実行する機能となります。

これを活用することで、定期的に行う処理を簡単にかつ完全に自動化を行うことができます。

では、これを使って「特定マップを開いて撮影をして自動的にEditorを閉じる」というようなツールを作ってみたいと思います。

その前に前準備として、「EditorScriptingUtilities」というプラグインを有効にしておきます。

Editor左上の「Edit」から「Plugins」を選択します。

出てきたウィンドウから「Editor Scripting Utilities」の項目を探して、「Enable」のチェックをつけてからエディターを再起動します。

できましたら最初に、適当なマップ内に撮影用のカメラを起きます。

ブログでは、とりあえずThirdPersonExampleMapと適当な場所にCameraアクターを配置します。
簡単に配置するには、ビューポート左上の「▼」から「CreateCameraHere」→「Camera」を選択することで、現在のビューポートカメラの位置にカメラを自動でおいてくれます。

次に、おいたカメラにTagをつけておきます。

「CameraActor」を選択している状態で、「Details」ウィンドウ内の「Actor」カテゴリ内の「Tags」の配列の+ボタンを押して、出現したボックスに「CaptureCamera」を選択します。

できましたら、Cameraアクターを入れたレベルをセーブしておきます。

次にエディター起動時に実行するEditorUtilityBlueprintを作成します。

ContentBrowser左上の「Add/Import」から、「Editor Utilities」→「EditorUtilityBlueprint」を選択します。

そして、出現した親クラス選択画面から、「EditorUtilityObject」を選択します。

作成できたらダブルクリックしてBlueprintを書いていきます。

分割したキャプチャー

・起動引数で「-CaptureMap=XXX(XXXはWorldのPackagePath)」というものがある場合、XXXのマップを開く

・「CaptureCamera」というタグがついたアクターを探して、そのアクターで「PilotView」モードにし、その後に「HighResShot」コマンドで、指定解像度で指定のPathに画像をキャプチャーして保存する。

起動引数で「-CaptureFinishAfterClose」というものがある場合、撮影終了時にエディターを自動的に終了する。

作成できましたら、Compileをして保存します。

次に、Editor起動時に起動するEditorUtilityBlueprintを設定します。

Projectがあるフォルダの「Config」以下に「DefaultEditorPerProjectUserSettings.ini」というファイルを作成します。

作成したらメモ帳などでファイルを開き、以下のように記載していきます。

; エディター起動時に起動するEditorUtilityBlkueprintのリスト
[/Script/Blutility.EditorUtilitySubsystem]
+StartupObjects=/Game/EUB_StartUpScript_CaptureMap.EUB_StartUpScript_CaptureMap

”/Game/EUB_StartUpScript_CaptureMap.EUB_StartUpScript_CaptureMap”
部分は、作成したEditorUtilityBlueprintアセットのオブジェクトパスを入力します。

オブジェクトパスは、アセットをクリックしてCtrl+Cしたあとにテキスト上でCtrl+Vをして、「’」内にある文字列の部分がアセットのオブジェクトパスとなります。

例:EditorUtilityBlueprint'/Game/EUB_StartUpScript_CaptureMap.EUB_StartUpScript_CaptureMap'
↓
/Game/EUB_StartUpScript_CaptureMap.EUB_StartUpScript_CaptureMap

最後に、起動引数付きのエディター起動用バッチを作成します。

@echo off
echo 起動引数付きでエディターを起動します
"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UE4Editor.exe" "%CD%\KA_StartArg.uproject" -CaptureMap=/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap -CaptureFinishAfterClose

さて、これで準備ができました。

これで、作成したバッチを起動すると以下のような
「指定のMapを開く」→「ビューポートカメラを任意のカメラに指定」→「撮影」→「エディターを閉じる」
を自動的に行ってくれるようになります。

バッチを実行するだけで勝手に処理を終えてくれました。便利ですね!

ちなみに、UE5(UE5.0.0 EA 2)でも試しましたが問題なく動作しました!

この処理はEditor起動時に引数を見て行っているので、通常のEditor起動では実行されないため、大きなプロジェクト等でプロジェクトデータを共有して使用している場合などに、独自のツールを作成して自動化を行いたい場合などにとても役に立ちます。
ローカルだけで完結でき、大掛かりなシステムを組む必要もないので、みなさんもぜひ活用してみてください。

+αタスクスケジューラに登録して完全自動化 レベル【★★★】

Windowsの「タスクスケジューラ」という機能を使うことで、バッチの起動すら定期的な時間に実行してくれるようにすることができます。
(ネット上にたくさん解説があるので調べてみてください。以下はその一例です)

【Windows 10対応】タスクスケジューラで定期的な作業を自動化する

タスクスケジューラに登録するには、「タスクスケジューラ」を起動するか、バッチ等のコマンドプロンプトから登録を行うことができます。

(↓タスクスケジューラの起動)

今回はタスクスケジューラ自体の説明を省くために、タスクスケジューラに登録するバッチを作成して登録する方法を紹介します。

新しくbatファイルを作成して、以下のようにコマンドを記載します。

@echo off
;毎日23:30に「StartArgTest.bat」を実行する
schtasks /create /tn AutoMapCapTest /tr "%CD%\StartArgTest.bat %CD%" /sc daily /st 23:30
pause

%CD%\StartArgTest.bat
の部分は、%CD%+実行するbatファイルの名前にしてください。
※バッチファイル名が日本語だとうまく行かなかったので、英語にしました。

23:30
の部分は、任意の時間を指定してみてください。

次に、引数付きで起動させる方のbatを作成し編集します。

@echo off
;直接起動でも、タスク起動でもCurDirを取得できるようにする
if ""%1""=="""" (
set CurDir=%CD%
) else (
set CurDir=%1
)
echo 起動引数付きでエディターを起動します
"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UE4Editor.exe" "%CurDir%\KA_StartArg.uproject" -CaptureMap=/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap -CaptureFinishAfterClose

これで準備はできました。
作成したタスクスケジューラ登録batを起動してみます。

以上です!

※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です