BLOGブログ

2019.12.11UE4UE/ Blueprint

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

執筆バージョン: Unreal Engine 4.23

こんにちは!本日は、UE4で作成するアプリケーションに渡される
コマンドライン引数の値を、Blueprint上で取得したいと思います。

C++からであれば、以下のようなコードで取得できます。
関数をBlueprintへ公開すれば、Blueprintからでも利用可能です。

// Key は、”SomeKeyName=” のように、”=” までつける必要があるよ。
FString USomeUtility::GetCommandLineValue(const FString& Key, bool& IsSucceeded)
{
FString Value;
IsSucceeded = FParse::Value(FCommandLine::Get(), *Key, Value);
return Value;
}

しかし…なんとか…なんとかBlueprintだけで完結できないものか。
コマンドライン引数っぽい関数とかないかなー。こう、 “GetCommandLine” 的な…

なんかいるー!!
えっなにじゃあパースもできたりするの??

うっ…これは、レベルを開くときに渡すオプションをパースするやつっぽい。
GetCommandLineの結果をTrimして 先頭に “?” をつけて ” -” を “?”に変えたのを突っ込めばそれなりに
どうやら、コマンドライン引数のパースはできないようですね!
しかし、コマンドライン引数として渡された文字列全体はGetできる。
ここは、Blueprintのノードだけで、コマンドライン引数をパースする関数を作ってみましょう!

さて、ここからは、取得したいコマンドライン引数の形式を、以下のいずれかである、という前提で解説します。

-KeyName=SomeValue
-KeyName=”Some Value”

引数のキーの前後にそれぞれ “-“、”=” があり、
引数の値にスペースを含む場合は、ダブルクォーテーションで囲んでいます。
とりわけ後者は、ファイルパスを渡す際などによくあるパターンですね。
Windowsの主要なフォルダにもスペースを含むパスがありますし、これは対応しておきたいです。

それでは、先ほど登場した、C++の FParse::Value() の実装を参考に、
以下のように組んでみることにします。

  1.  “-KeyName=” を探す
  2. “-KeyName=” の次の文字がダブルクォーテーションなら、その次以降の文字で最も近いダブルクォーテーションを探して、その手前までを値とする。
  3.  “-KeyName=” の次の文字がダブルクォーテーションでないなら、”=” の次の文字以降で最も近いスペースを探して、その手前までを値とする。




できました!それでは、テストしてみましょう。
BeginPlayから作成した関数を呼び出すようにします。

メニューバー [Edit]-[Editor Preferences…] を開き、”Additional Launch Parameters” を検索します。
(“la para” ぐらいで十分絞り込めます…)
ここに例えば以下のような値をセットし、起動時にコマンドライン引数として渡されるようにします。

さて、それでは、Standalone起動してみましょう。

できました!

今回は特定のコマンドライン引数に指定された値を、Blueprintだけで取得してみました。
限定的な書式のみの対応ですが、UE4で作ったアプリで何かを指定しつつ起動してみたい!という用途には十分使えるかと思います。
もし活用できそうな場面がありましたら、ぜひお試しください。