
目次
※この記事で使用しているUnrealのVersionは04.22.3 です。
※この記事のサンプルプロジェクトはございません。
※このブログは自分のメモ用なので、Twitterでの告知をしておりません。
BPからEditorUtilityWidgetを実行 レベル【★★★☆】
書かないとか言っておいて、メモしておきたくなったので、C++の記事を書きます。
今回はEditorUtilityWidgetをBlueprintから実行する方法についてです。
まずはC++プロジェクトを作成します。

次に新規でC++クラスを作成します。

親クラスは、「Blueprint Function Library」にします。

MyBlueprintFunctionLibrary.hの中身はこんな感じです

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Editor/Blutility/Classes/EditorUtilityWidget.h"
#include "MyBlueprintFunctionLibrary.generated.h"
/**
*
*/
UCLASS(BlueprintType)
class KA_EUW_CALLBP_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
static void RunEditorUtilityWidget(UWidgetBlueprint* Blueprint);
};
つづいて、MyBlueprintFunctionLibrary.cppの中身はこんな感じです。

// Fill out your copyright notice in the Description page of Project Settings.
#include "MyBlueprintFunctionLibrary.h"
#include "Editor/UMGEditor/Public/WidgetBlueprint.h"
#include "Editor/LevelEditor/Public/LevelEditor.h"
#include "Runtime/Core/Public/Modules/ModuleManager.h"
#include "Editor/Blutility/Public/IBlutilityModule.h"
#include "Editor/Blutility/Classes/EditorUtilityWidgetBlueprint.h"
//AssetTypeActions_EditorUtilityWidgetBlueprint.cpp内にある、ExecuteRun()を移植しただけ。
void UMyBlueprintFunctionLibrary::RunEditorUtilityWidget(UWidgetBlueprint* Blueprint)
{
if (Blueprint->GeneratedClass->IsChildOf(UEditorUtilityWidget::StaticClass()))
{
const UEditorUtilityWidget* CDO = Blueprint->GeneratedClass->GetDefaultObject();
if (CDO->ShouldAutoRunDefaultAction())
{
// This is an instant-run blueprint, just execute it
UEditorUtilityWidget* Instance = NewObject(GetTransientPackage(), Blueprint->GeneratedClass);
Instance->ExecuteDefaultAction();
}
else
{
FName RegistrationName = FName(*(Blueprint->GetPathName() + TEXT("_ActiveTab")));
FText DisplayName = FText::FromString(Blueprint->GetName());
FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked(TEXT("LevelEditor"));
TSharedPtr LevelEditorTabManager = LevelEditorModule.GetLevelEditorTabManager();
/*この部分を入れるとエラーが起きたので、とりあえず省いた。
if (!LevelEditorTabManager->CanSpawnTab(RegistrationName))
{
IBlutilityModule* BlutilityModule = FModuleManager::GetModulePtr("Blutility");
UEditorUtilityWidgetBlueprint* WidgetBlueprint = Cast(Blueprint);
WidgetBlueprint->SetRegistrationName(RegistrationName);
LevelEditorTabManager->RegisterTabSpawner(RegistrationName, FOnSpawnTab::CreateUObject(WidgetBlueprint, &UEditorUtilityWidgetBlueprint::SpawnEditorUITab))
.SetDisplayName(DisplayName)
.SetGroup(BlutilityModule->GetMenuGroup().ToSharedRef());
BlutilityModule->AddLoadedScriptUI(WidgetBlueprint);
}
*/
TSharedRef NewDockTab = LevelEditorTabManager->InvokeTab(RegistrationName);
}
}
}
さらに、Build.csファイル内の「PublicDependencyModuleNames.AddRange」に、
「”Slate”, “SlateCore”, “UnrealEd”, “Blutility”, “UMG”, “UMGEditor”」を追加します。

これで、コードを書くのは終わり。
エディターに戻ってコンパイルを押します。

次に、確認のためのEditorUtilityWidgetを作ります。
コンテンツブラウザ左上の「Add New」から「Editor Utilities」→「Editor Widget」を選択します。

中を開いたら、適当なWidgetを作っておきましょう。

次に、先ほどC++で作った関数を呼び出すための「Blutility」を作ります。
エディター左上の「Edit」→「Editor Preference」を選択します。

「General」→「Experimental」→「Tool」→「Editor Utility Blueprint (Blutility)」のチェックボックスにチェックを入れます。

できましたら、コンテンツブラウザ左上の「Add New」から「Editor Utilities」→「Blutility」を選択します。


親クラスは、今回は「GlobalEditor Utility Base」を選択します。
作ったアセットを右クリック「Edit Blueprint」を選択します。
開いたら以下のようにノードを組みます。

出来ましたら、あとはBlutilityアセットをダブルクリックして、作成したイベントのボタンを押すだけです。
※一度手動でEditorUtilityWidgetを起動しないと、↓のような画面になってしまいます。
おそらく移植したコードのコメントアウトした部分ですが、原因特定が面倒だったので解決できなかったです。

※この記事のサンプルプロジェクトはございません。