1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UE5 Commandletについての備忘録

Posted at

概要

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エディタを起動させずに実行することができます。
コマンドレットの実行環境は「ゲームが読み込まれていない」「クライアントコードが読み込まれていない」「レベルが読み込まれていない」「アクターが存在しない」生の環境で実行されます。そのためモジュールの読み込みが通常ゲーム時と違うことがあります。

コマンドレットの作成&実行

最小限のコマンドレットコードの作成

最小限のコマンドレットコード例で、実行してからログを出すだけです。

MyCommandlet.h
#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;
};
MyCommandlet.cpp
#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以外の開発時用モジュールに置きたいと思ったのですが、ここで別モジュールへ持っていくと動作しなくなった(コマンドレットが見つからなかった)のでその時の注意点をまとめます。

コマンドレットコードを別モジュールへ持っていく場合の注意

Lyraの .uproject モジュール設定
	"Modules": [
		{
			"Name": "LyraGame",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
				"DeveloperSettings",
				"Engine"
			]
		},
		{
			"Name": "LyraEditor",
			"Type": "Editor",
			"LoadingPhase": "Default"
		}
	],

ここの "Type" が RuntimeDeveloperTool に設定されているモジュールに書く必要があり、かつ "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にエディタ用コードを書いてモジュール追加した方が速いかもしれません。

.Build.cs
public class MyGame : ModuleRules
{
public MyGame(ReadOnlyTargetRules Target) : base(Target)
{
	...省略...

	// エディタ用
	if (Target.bBuildEditor)
	{
		// エディタ専用にUnrealEdモジュールを追加
		PrivateDependencyModuleNames.AddRange( new string[] { "UnrealEd", "EditorScriptingUtilities" } );
	}
}
}

まとめ

コマンドレットのより良い使い方ができていない気がします。
より良い使い方アイデアを募集中

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?