こんにちは、株式会社Leon Gameworksの遠藤です。今回は、Editor Utility WidgetからPlay in Editor(以下、PIE)の実行を制御するツールを作成したいと思います。
0:動作環境
本記事はUE5.5.4を基に執筆しており、エディタの言語は「英語」でスクリーンショットを撮影しております。
本記事で作成するツールのプロジェクト一式のデータは、以下からダウンロードできます。
1:ツールの外観作成
まずはツールの外観を作成していきます。
Editor Utility Widgetを作成し、アセット名を「EUW_ControlPIE」とします。

アセットを開き、Widgetの構成を以下のように組みます。

2:PIEの制御
外観の準備ができたところで、PIEを制御する処理を書いていきます。制御する機能はC++からアクセスできるのでC++で処理を書き、ブループリントに公開します。
まずは「LevelEditorSubsystem」を継承したクラスを作成します。

クラス名は「MyLevelEditorSubsystem」としました。

「PlayPIE」と「StopPIE」という関数を追加しました。それぞれ名前の通り、PIEを開始/停止する関数です。
UCLASS()
class EUTOOLS15_API UMyLevelEditorSubsystem : public ULevelEditorSubsystem
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
static void PlayPIE(bool IsNewEditorWindow);
UFUNCTION(BlueprintCallable)
static void StopPIE();
};
次に、Build.csファイルに「UnrealEd」モジュールを追加します。
using UnrealBuildTool;
public class EUTools15 : ModuleRules
{
public EUTools15(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UnrealEd" });
}
}
UMyLevelEditorSubsystemのcppファイルに移動し、PIEの開始/停止処理を書きます。
#include "MyLevelEditorSubsystem.h"
#include "LevelEditor.h"
#include "Modules/ModuleManager.h"
#include "UnrealEdGlobals.h"
#include "Editor/UnrealEdEngine.h"
void UMyLevelEditorSubsystem::PlayPIE(bool IsNewEditorWindow)
{
FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked<FLevelEditorModule>("LevelEditor");
TSharedPtr ActiveLevelViewport = LevelEditorModule.GetFirstActiveViewport();
if (ActiveLevelViewport.IsValid())
{
FRequestPlaySessionParams SessionParams;
SessionParams.WorldType = EPlaySessionWorldType::PlayInEditor;
if (!IsNewEditorWindow)
{
SessionParams.DestinationSlateViewport = ActiveLevelViewport;
}
GUnrealEd->RequestPlaySession(SessionParams);
}
}
void UMyLevelEditorSubsystem::StopPIE()
{
FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked<FLevelEditorModule>("LevelEditor");
TSharedPtr ActiveLevelViewport = LevelEditorModule.GetFirstActiveViewport();
if (ActiveLevelViewport.IsValid())
{
GUnrealEd->RequestEndPlayMap();
}
}
処理が書けたらUEエディタに戻り、Play/Stopそれぞれのボタンの処理を画像のように繋ぎます。

これで完成です。早速実行してみましょう。「New Window」にチェックを入れることで、新規ウィンドウで実行できます。
3:プレイ環境の制御
C++で書いた「RequestPlaySession」に渡したパラメータを変更することで、プレイ環境を制御することができます。
特に「EditorPlaySettings」では、ウィンドウの位置や解像度など指定できるので非常に便利です。
FRequestPlaySessionParams SessionParams;
ULevelEditorPlaySettings* PlaySettings = NewObject<ULevelEditorPlaySettings>();
PlaySettings->NewWindowWidth = 1920;
PlaySettings->NewWindowHeight = 1080;
PlaySettings->CenterNewWindow = true;
SessionParams.EditorPlaySettings = PlaySettings;
GUnrealEd->RequestPlaySession(SessionParams);
「EditorPlaySettings」のパラメータは、[Editor Preferences → Play]で設定できる項目と同じです。

4:まとめ
Editor UtilityからPIEを制御できると、様々なツールに応用することができます。ぜひ活用いただけたら幸いです。
本記事で作成するツールのプロジェクト一式のデータは、以下からダウンロードできます。

株式会社Leon Gameworks
●公式サイト
www.leon-game.co.jp
●X(Twitter)
@Leon_Gameworks

トンコツ(遠藤俊太)
●トンコツ開発ブログ
shuntaendo.hatenablog.com
●X(Twitter)
@tonkotsu3656
TEXT_トンコツ(Leon Gameworks)
EDIT_小村仁美 / Hitomi Komura(CGWORLD)、オムライス駆