Resources

  • See UGameplayEffectCreationMenu for an example.

Simple Injecting

FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
	ContentBrowserModule.GetAllAssetContextMenuExtenders().Add(
		FContentBrowserMenuExtender_SelectedPaths::CreateLambda([] (const TArray<FString>& SelectedPaths)
		{
			TSharedRef<FExtender> Extender = MakeShared<FExtender>();
			
			// Add generic menu
			Extender->AddMenuExtension(
				"ContentBrowserNewAdvancedAsset",
				EExtensionHook::Before,
				TSharedPtr<FUICommandList>(),
				FMenuExtensionDelegate::CreateLambda([] (FMenuBuilder& ExtenderBuilder)
				{
					ExtenderBuilder.AddMenuSeparator();
					ExtenderBuilder.AddSubMenu(
						INVTEXT("AARootMenu"),
						INVTEXT("AA"),
						FNewMenuDelegate::CreateLambda([] (FMenuBuilder& RootMenuBuilder)
						{
							RootMenuBuilder.AddMenuEntry(
								INVTEXT("Test1"),
								INVTEXT("Test 1"),
								FSlateIcon(),
								FUIAction(FExecuteAction::CreateLambda([](){}))
							);
							
							RootMenuBuilder.AddMenuEntry(
								INVTEXT("Test2"),
								INVTEXT("Test 2"),
								FSlateIcon(),
								FUIAction(FExecuteAction::CreateLambda([](){}))
							);
							
						})
					);
				})
			);
			return Extender;
		}));

Creating an asset

Note: You cannot create multiple assets in one “go” because on how UE handles asset creation (you will get a ensure if you try to do so). But they are ways to work around that.

Basically you need a package name (Folder destination), an asset name (file name) and a factory (used to create the asset).

Here is an example to create a Blueprint Asset and a Data Asset.

// Here the BasePath (or Path) used comes from the SelectedPaths param that FContentBrowserMenuExtender_SelectedPaths returns.
// The first entry should always be valid so its safe to cache it early as FString Path = SelectedPaths[0].
 
void FContentBrowserExtender::CreateGenericAsset(FString BasePath, FString AssetName, UClass* CoreClass, UFactory* Factory)
{
	FString PackageName = BasePath;
	FString DefaultFullPath = PackageName / AssetName;
	
	FAssetToolsModule& AssetToolsModule = FAssetToolsModule::GetModule();
	
	AssetToolsModule.Get().CreateUniqueAssetName(
		DefaultFullPath,
		TEXT(""),
		PackageName,
		AssetName
	);
	
	auto& LocalContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
	LocalContentBrowserModule.Get().CreateNewAsset(
		*AssetName,
		BasePath,
		CoreClass,
		Factory
	);
}
 
void FContentBrowserExtender::CreateBlueprint(FString BasePath, UClass* Class, FString AssetName)
{
	auto* BlueprintFactory = NewObject<UBlueprintFactory>();
	BlueprintFactory->ParentClass = Class;
	CreateGenericAsset(BasePath, AssetName, UBlueprint::StaticClass(), BlueprintFactory);
}
 
void FContentBrowserExtender::CreateDataAsset(FString BasePath, UClass* Class, FString AssetName)
{
	auto* DataAssetFactory = NewObject<UDataAssetFactory>();
	DataAssetFactory->DataAssetClass = Class;
	CreateGenericAsset(BasePath, AssetName, UDataAsset::StaticClass(), DataAssetFactory);
}
 
// Usage
CreateBlueprint(Path, UCharacterGameplayAbility::StaticClass(), "GA_");
CreateBlueprint(Path, UGameplayEffect::StaticClass(), "GE_");
CreateDataAsset(Path, UCharacterSkillDefinition::StaticClass(), "DA_");