こんにちは、株式会社Leon Gameworksの遠藤です。今回は、Editor Utility WidgetからPlay in Editor(以下、PIE)の実行を制御するツールを作成したいと思います。

記事の目次

    0:動作環境

    本記事はUE5.5.4を基に執筆しており、エディタの言語は「英語」でスクリーンショットを撮影しております。

    本記事で作成するツールのプロジェクト一式のデータは、以下からダウンロードできます。

    今回のプロジェクトデータ

    1:ツールの外観作成

    まずはツールの外観を作成していきます。
    Editor Utility Widgetを作成し、アセット名を「EUW_ControlPIE」とします。

    ▲ EUW_ControlPIE

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

    ▲ Widgetの構成

    2:PIEの制御

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

    まずは「LevelEditorSubsystem」を継承したクラスを作成します。

    ▲ 「LevelEditorSubsystem」の継承

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

    ▲ 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それぞれのボタンの処理を画像のように繋ぎます。

    ▲ PIE開始・停止の処理

    これで完成です。早速実行してみましょう。「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]で設定できる項目と同じです。

    ▲ [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)、オムライス駆