前言
奇葩需求, EditorUtilityWiget用cpp来运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
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, 否则还能写个通用方法)