- Published on
关于EditorUtilityWiget用cpp来运行
- Authors

- Name
- 东哥
前言
奇葩需求, EditorUtilityWiget用cpp来运行
//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的类), 没法自己初始化, 解决方法二选一
- 手动右键先运行一次(不推荐)
- 使用
AutoRunDefaultAction, 然后在蓝图中自己运行自己的资源(这个资源还没法cast, 否则还能写个通用方法)
