概要
UnrealEngine5 で久しぶりコマンドレットを使った際にうまく動かなかったため、備忘録としてのメモ
更新履歴
| 日付 | 内容 |
|---|---|
| 2025/10/28 | 初版 |
参考
以下を参考にさせて頂きました、ありがとうございます。
UE公式:UCommandlet
【UE5】Commandlet備忘録
【UE5】コマンドレットの実装と、実際に使用して
関連過去記事
UE4 CommandletでBPを変更してみる
UE4 Commandletでアセットを一括修正してみる
環境
Windows11
Visual Studio 2022
UnrealEngine 5.6
関連ソース
"Engine\Source\Runtime\Engine\Classes\Commandlets\Commandlet.h"
コマンドレットについて
コンソールアプリのことで、GUIエディタを起動させずに実行することができます。
コマンドレットの実行環境は「ゲームが読み込まれていない」「クライアントコードが読み込まれていない」「レベルが読み込まれていない」「アクターが存在しない」生の環境で実行されます。そのためモジュールの読み込みが通常ゲーム時と違うことがあります。
コマンドレットの作成&実行
最小限のコマンドレットコードの作成
最小限のコマンドレットコード例で、実行してからログを出すだけです。
#pragma once
#include "Commandlets/Commandlet.h"
#include "MyCommandlet.generated.h"
UCLASS()
class UMyCommandlet : public UCommandlet
{
GENERATED_BODY()
public:
UMyCommandlet(const FObjectInitializer& ObjectInitializer);
virtual int32 Main(const FString& Params) override;
};
#include "MyCommandlet.h"
UMyCommandlet::UMyCommandlet(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
// メイン処理
int32 UMyCommandlet::Main(const FString& Params)
{
UE_LOG(LogTemp, Log, TEXT("Exec MyCommandlet!"));
return(0);
}
実行する
UE4時代は UE4Editor-Cmd.exe で実行していましたが、UE5では UnrealEditor-Cmd.exe になったようです。-run でコマンドレットを指定します。
{エンジンパス}\Binaries\Win64\UnrealEditor-Cmd.exe {プロジェクトパス}\MyProject.uproject -run=My
コマンドレットコードとモジュールについて
コマンドレットは開発時に必要なものであるため、Runtime以外の開発時用モジュールに置きたいと思ったのですが、ここで別モジュールへ持っていくと動作しなくなった(コマンドレットが見つからなかった)のでその時の注意点をまとめます。
コマンドレットコードを別モジュールへ持っていく場合の注意
"Modules": [
{
"Name": "LyraGame",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"DeveloperSettings",
"Engine"
]
},
{
"Name": "LyraEditor",
"Type": "Editor",
"LoadingPhase": "Default"
}
],
ここの "Type" が RuntimeかDeveloperTool に設定されているモジュールに書く必要があり、かつ "LoadingPhase" が Default でないとコマンドレット実行時に読みこまれないようです。(依存関係によっては読みこまれるかもしれませんが、PostEngineInitでは読みこまれませんでした)
#include "UObject/UObjectGlobals.h"
const FName CommandletClassName = TEXT("MyCommandlet");
UClass* FoundClass = FindObject<UClass>(ANY_PACKAGE, *CommandletClassName.ToString());
if (FoundClass){
UE_LOG(LogTemp, Display, TEXT("%sがある"), *CommandletClassName.ToString());
}
else{
UE_LOG(LogTemp, Error, TEXT("%sが見当たらない"), *CommandletClassName.ToString());
}
ゲームモジュールのBuild.csにエディタ用コードを書いてモジュール追加した方が速いかもしれません。
public class MyGame : ModuleRules
{
public MyGame(ReadOnlyTargetRules Target) : base(Target)
{
...省略...
// エディタ用
if (Target.bBuildEditor)
{
// エディタ専用にUnrealEdモジュールを追加
PrivateDependencyModuleNames.AddRange( new string[] { "UnrealEd", "EditorScriptingUtilities" } );
}
}
}
まとめ
コマンドレットのより良い使い方ができていない気がします。
より良い使い方アイデアを募集中