関連ブログ
- [UE5]Modular Control Rigを使ってみよう 2024.11.27UE
- [UE5] Soundscapeプラグインを使ってみる 2024.11.13UE
- [UE5] Batch Renamerを使って一括でアセット名をリネームしよう! 2024.11.06UE
CATEGORY
2024.06.26UE5UE/ C++UE/ Editor拡張
執筆バージョン: Unreal Engine 5.1 |
Editor Utility Widget (EUW)でPlay In Editor (PIE)実行を行う方法の紹介です。
EUWを使ったエディタ拡張を実装している時に、PIE実行(プレビュー実行)を行いたい事があるかと思います。
デフォルトでは、Level Editor SubsystemにEditor Play Simulateというノードが存在しますが、こちらを使用した場合はSimulate In Editorモードとなってしまうため、プレイヤーポーンが生成されない等の挙動がやりたいことに沿わないことがあります。
Simulate In Editorではなく、Play In Editorを行う為にはC++による実装が必要となります。
まず、今回必要な機能を利用するためUnrealEdというモジュールを利用できるようにします。
初期状態のプロジェクトではロードされていない為、プロジェクトのBuild.csファイルに以下の例を参考にUnrealEdモジュール追加の記述をしてください。
1 2 3 4 5 6 7 8 9 |
public class MyProject : ModuleRules { public MyProject (ReadOnlyTargetRules Target) : base(Target) { PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UnrealEd" }); PrivateDependencyModuleNames.AddRange(new string[] { }); } } |
あくまで一例なので、ご自身のプロジェクトに合わせて、PublicDependencyModuleNamesまたはPrivateDependencyModuleNamesに”UnrealEd”の追加ができればOKです。
モジュールが利用できる状態になったら、クラスの実装を行います。
今回はULevelEditorSubsystemを継承したクラスとします。
これによりLevelEditorSubsystemの持つ機能もそのまま使うことのできるEditorSubsystemとしてEditorUtility内で利用できます。
サンプルソースコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#pragma once #include "CoreMinimal.h" #include "LevelEditorSubsystem.h" #include "MyLevelEditorSubsystem.generated.h" UCLASS() //LevelEditorSubsystemを継承することで他のLevelEditorSubsystemの処理も利用できるように。 class MYPROJECT API UMyLevelEditorSubsystem : public ULevelEditorSubsystem { GENERATED_BODY() public: UFUN CTION(BlueprintCallable, Category = "Editor Scripting | Level Utility", meta = (DevelopmentOnly)) static void EditorPlay(bool IsNewEditorWindow); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include "MyLevelEditorSubsystem.h" #include "LevelEditor.h" #include "Modules/ModuleManager.h" #include "IAssetViewport.h" #include "UnrealEdGlobals.h" #include "Editor/UnrealEdEngine.h" void UMyLevelEditorSubsystem::EditorPlay(bool IsNewEditorWindow) { FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked("LevelEditor"); TSharedPtr ActiveLevelViewport = LevelEditorModule.GetFirstActiveViewport(); if (ActiveLevelViewport.IsValid()) { FRequestPlaySessionParams SessionParams; SessionParams.WorldType = EPlaySessionWorldType::PlayInEditor; if (!IsNewEditorWindow) { //SelectedViewportとしてPIEを行う場合の処理 SessionParams.DestinationSlateViewport = ActiveLevelViewport; } GUnrealEd->RequestPlaySession(SessionParams); } } |
ちなみに、Playを停止する場合はEditor End PlayまたはLevel Editor SubsystemのEditor Request End Playノードを利用することで止めることができます。
Editor Utility WidgetやEditor Utility BlueprintでのPIEが出来るようになると自動化やツール制作での選択肢が増えますので、参考になれば幸いです。