はじめに
以前の記事でPythonを実行する方法を書きましたが、
この機能は実験的機能なので、ゲームをパッケージ化したら、うまく使用できません。
本記事でコマンドプロンプトを呼び出し、Pythonを実行する方法を紹介します。
Unreal Engineドキュメント:Python を使用したエディタのスクリプティング
https://docs.unrealengine.com/5.0/ja/scripting-the-unreal-editor-using-python/
この方法は、C++で関数(BlueprintFunctionLibrary)を書いて、ブループリントで関数ノードを使用する方法です。
準備
Unreal EngineとVisual Studioをインストールします。
セットアップは下記のURLを参考にしてください。
方法
Step 1 新規C++クラス BlueprintFunctionLibrary
UEでBlueprintFunctionLibraryクラスを新規します。
以前の記事で簡単な説明をしています。良ければ参考にしてください。
Step 2 コードの編集
①.hファイルでRunMyPython関数を追加します。
UFUNCTION(BlueprintCallable, Category = "RunPython")
static bool RunMyPython(int32& ProcessId,
FString FullPathOfProgramToRun, TArray<FString> CommandlineArgs, bool Hidden);
引数と戻り値の意味は下の通りです。
- 引数
- FullPathOfProgramToRun:python.exeへのパス (FString型)
- CommandlineArgs:コマンドライン引数 (FString型の配列)
- Hidden:コマンドプロンプトのウィンドウの表示/非表示 (bool型)
- 戻り値
- ProcessId:実行中のプロセスid (int32型)
- return:プロセスが完成すると、trueを戻る (bool型)
②.cppファイルでRunMyPython関数の詳細コードを書きます。
bool UForExePython::RunMyPython(int32& ProcessId, FString FullPathOfProgramToRun,
TArray<FString> CommandlineArgs, bool Hidden)
{
/*
コマンドライン引数の配列を空白で結合する
*/
FString Args = "";
if (CommandlineArgs.Num() > 1)
{
Args = CommandlineArgs[0];
for (int32 v = 1; v < CommandlineArgs.Num(); v++)
{
Args += " " + CommandlineArgs[v];
}
}
else if (CommandlineArgs.Num() > 0)
{
Args = CommandlineArgs[0];
}
/*
新しいプロセスを作成する(CreateProcess関数と似てるもの)
*/
uint32 NeedBPUINT32 = 0;
FProcHandle ProcHandle = FPlatformProcess::CreateProc(
*FullPathOfProgramToRun,
*Args,
Hidden, //trueにしたら、コマンドプロンプトのウィンドウを非表示にする
false,
false,
&NeedBPUINT32,
0,
nullptr,
nullptr);
ProcessId = NeedBPUINT32;
if (ProcHandle.IsValid()) {
/*
上記のプロセスが終了したまで、待ちます。
*/
while (FPlatformProcess::IsProcRunning(ProcHandle));
FPlatformProcess::CloseProc(ProcHandle);
}
return true; //プロセスが終了して、trueを戻る。
}
使用方法
C++ファイルを修正し、UEのプロジェクトを更新して、ブループリントでRun My Pythonノードが使用できると思います。
-
説明1
上記の画像通りで、入力も同じ文字列で使用すると、
普通のコマンドプロンプト(Windowsではcmd)で、"C:/xxx/xxx/python.exe" pyfile.py --input C:/xxx/xxx/myfile.txt
というコマンドを実行すると同じ結果が出るはずです。 -
説明2
Hidden
にチェックを入れると、コマンドプロンプトのウィンドウを表示しません。 -
説明3
Pythonプロセスを終了して、Return Value
ではtrueが出力します。
とは言え、Pythonプロセスを待つことが可能になります。
感想
Windowsでアプリを開発すると、C/C++言語は汎用性が高いので、よく使われます。今回は、Unreal EngineでPythonを使用したいため、色々調べて実現できました。
最後まで読んでいただき、ありがとうございました。
皆さんの参考になれば幸いです。