关于EditorUtilityWiget用cpp来运行

前言

奇葩需求, EditorUtilityWiget用cpp来运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//SelectObject = 任意编辑器UMG资源

UWidgetBlueprint* Blueprint = Cast<UWidgetBlueprint>(SelectObject);
if (Blueprint && Blueprint->GeneratedClass->IsChildOf(UEditorUtilityWidget::StaticClass())) {
const UEditorUtilityWidget* CDO = Blueprint->GeneratedClass->GetDefaultObject<UEditorUtilityWidget>();
if (CDO->ShouldAutoRunDefaultAction()) {
UEditorUtilityWidget* Instance = NewObject<UEditorUtilityWidget>(GetTransientPackage(), Blueprint->GeneratedClass);
Instance->ExecuteDefaultAction();
}
else {
FName RegistrationName = FName(*(Blueprint->GetPathName() + TEXT("_ActiveTab")));
FText DisplayName = FText::FromString(Blueprint->GetName());
FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked<FLevelEditorModule>(TEXT("LevelEditor"));
TSharedPtr<FTabManager> LevelEditorTabManager = LevelEditorModule.GetLevelEditorTabManager();
TSharedRef<SDockTab> NewDockTab = LevelEditorTabManager->InvokeTab(RegistrationName);
}

}

这个方案有缺陷, 就是第一次还是需要在编辑器下右键运行一次才能用cpp来运行, 因为右键运行会调用到 UEditorUtilitySubsystem::SpawnAndRegisterTab(), 在这个函数中会对UMG进行初始化, 而用上述方法是没法初始化的

恶心的问题是, 此模块基本上都没有导出符号(即没法在自己的cpp中使用任何有关UEditorUtilityWidget的类), 没法自己初始化, 解决方法二选一

  1. 手动右键先运行一次(不推荐)
  2. 使用AutoRunDefaultAction, 然后在蓝图中自己运行自己的资源(这个资源还没法cast, 否则还能写个通用方法)

image-20210106162756815