Published on

关于EditorUtilityWiget用cpp来运行

前言

奇葩需求, 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的类), 没法自己初始化, 解决方法二选一

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

image-20210106162756815