UE 在Editor的资源右键菜单上添加两个按钮

本文记录了在Unreal Engine 4 (UE4) 中如何扩展Content Browser的右键菜单,添加上传资源的功能。通过自定义FAssetUploaderMenu类,实现了默认参数和用户输入描述两种上传方式,并展示了代码实现过程。
摘要由CSDN通过智能技术生成

今天接到个任务,需要在Editor的资源右键菜单上添加两个按钮,用来上传资源,一个是默认参数上传,一个是用户输入描述去上传,研究了半天,最后在UE的源码里找到的作业抄了下来,做个记录,由于周五了实在是太累了,不想详细写了,直接贴代码吧,后续有心情再改。效果如下

在这里插入图片描述

#pragma once
#include "CoreMinimal.h"
#include "Templates/SharedPointer.h"
#include "Framework/MultiBox/MultiBoxExtender.h"
#include "UObject/NoExportTypes.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "IPlatformFilePak.h"
#include "ResourceLoader.h"
#include "Blueprint/UserWidget.h"
#include "Templates/SubclassOf.h"
#include "ToolMenuSection.h"
#include "AssetMeta.h"
#include "AssetHttpUploader.h"


class XVERSEASSETUPLOADER_API FAssetUploaderMenu : public TSharedFromThis<FAssetUploaderMenu>
{
private:
	TArray<FName> AssetPathArray;

	FAssetUploaderMenu& operator=(const FAssetUploaderMenu&) = delete;
	FAssetUploaderMenu(const FAssetUploaderMenu&) = delete;

public:

	FAssetUploaderMenu() = default;

	TSubclassOf<class UUserWidget> HUDAssetUpload = nullptr;

	UUserWidget* HUDAssetUploadUI;

	static FAssetUploaderMenu& Get();

	void RegisterMenu();

	void AssetUpload(const FNewAsset& NewAsset);

	void AssetUploadDefaultParameter();

	bool CanExecuteAssetUpload() const;

	void AddAssetUploaderMenu(UToolMenu* InMenu);

	void ShowDialog();

};


#include "AssetUploaderMenu.h"
#include "ContentBrowserDelegates.h"
#include "Modules/ModuleManager.h"

#include "Framework/MultiBox/MultiBoxExtender.h"
#include "ToolMenus.h"
#include "Framework/Commands/UIAction.h"
#include "ContentBrowserDataMenuContexts.h"
#include "ContentBrowserItem.h"
#include "ResourceLoader.h"
#include "GenericSingletons.h"
#include "AssetMeta.h"
#include "AssetHttpUploader.h"
#include "Engine/World.h"
#include "UObject/NoExportTypes.h"
#include "UMGEditor/Public/WidgetBlueprint.h"
#include "Blutility/Classes/EditorUtilityWidget.h"
#include "LevelEditor.h"
#include "UObject/UObjectGlobals.h"
#include "Modules/ModuleManager.h"
#include "EditorAssetLibrary.h"
#include "EditorUtilitySubsystem.h"
#include "ContentBrowserMenuContexts.h"
#include "EditorUtilitySubsystem.h"
#include "Blutility/Classes/EditorUtilityWidgetBlueprint.h"

#if WITH_EDITOR
#include "ContentBrowserModule.h"
#endif

#define LOCTEXT_NAMESPACE "AssetUploadMenu"



void FAssetUploaderMenu::AssetUploadDefaultParameter()
{
//公司隐私代码,已经删除,个人根据自己业务需求来处理,这里是收到了,用户点击按钮的事件
}


void FAssetUploaderMenu::AssetUpload(const FNewAsset& NewAsset)
{
	//公司隐私代码,已经删除,个人根据自己业务需求来处理,这里是收到了
}

/* 
显示对话框
*/
void FAssetUploaderMenu::ShowDialog()
{
	const FString Path = FString(TEXT("/Game/AssetManager/AssetUpload_Dialog.AssetUpload_Dialog"));
	UObject* LoadedObject = LoadObject<UObject>(NULL, *Path, NULL, LOAD_NoRedirects, NULL);

	//LoadedObject->GetClass()->IsA(UStaticMesh::StaticClass());
	FString Name = LoadedObject->GetClass()->GetName();
	UE_LOG(LogTemp, Display, TEXT("Name:%s"), *Name);
	/*if(LoadedObject->GetClass()->GetName() == "StaticMesh")
	{
		UE_LOG(LogTemp, )
	}*/
	UWidgetBlueprint* Blueprint = Cast<UWidgetBlueprint>(LoadedObject);
	if (Blueprint->GeneratedClass->IsChildOf(UEditorUtilityWidget::StaticClass()))
	{
		UEditorUtilityWidgetBlueprint* EditorWidget = Cast<UEditorUtilityWidgetBlueprint>(Blueprint);
		if (EditorWidget)
		{
			UEditorUtilitySubsystem* EditorUtilitySubsystem = GEditor->GetEditorSubsystem<UEditorUtilitySubsystem>();
			EditorUtilitySubsystem->SpawnAndRegisterTab(EditorWidget);
		}
	}
}


bool FAssetUploaderMenu::CanExecuteAssetUpload() const
{
	return AssetPathArray.Num() > 0;
}

void FAssetUploaderMenu::AddAssetUploaderMenu(UToolMenu* InMenu)
{
	const UContentBrowserDataMenuContext_FileMenu* ContextObject = InMenu->FindContext<UContentBrowserDataMenuContext_FileMenu>();
	checkf(ContextObject, TEXT("Required context UContentBrowserDataMenuContext_FileMenu was missing!"));

	for (const FContentBrowserItem& SelectedItem : ContextObject->SelectedItems)
	{
		const FContentBrowserItemData* SelectedItemData = SelectedItem.GetPrimaryInternalItem();
		FName ResourcePath = SelectedItemData->GetVirtualPath();
		AssetPathArray.Add(ResourcePath);
	}

	FToolMenuSection& Section = InMenu->AddSection("UploadAsset");
	{
	/*	UContentBrowserAssetContextMenuContext* Context = Section.FindContext<UContentBrowserAssetContextMenuContext>();
		TArray<UObject*> Objects = Context->GetSelectedObjects();*/
		// 添加两个按钮
		Section.AddMenuEntry("SCCUploadAsset",
						 LOCTEXT("SCCUploadAsset", "Upload Asset..."),
						 LOCTEXT("SCCUploadAssetTooltip", "You will upload asset to consol."),
						 FSlateIcon(),
							 FUIAction(FExecuteAction::CreateSP(this, &FAssetUploaderMenu::ShowDialog),
								 FCanExecuteAction::CreateSP(this, &FAssetUploaderMenu::CanExecuteAssetUpload)));

		Section.AddMenuEntry("SCCUploadAssetDefaultParameter",
							 LOCTEXT("SCCUploadAssetDefaultParameter", "Upload Asset Default Parameter"),
							 LOCTEXT("SCCUploadAssetDefaultParameterTooltip", "You will need to write Asset parameter."),
							 FSlateIcon(),
							 FUIAction(FExecuteAction::CreateSP(this, &FAssetUploaderMenu::AssetUploadDefaultParameter),
							 FCanExecuteAction::CreateSP(this, &FAssetUploaderMenu::CanExecuteAssetUpload)));
	}
}

FAssetUploaderMenu& FAssetUploaderMenu::Get()
{
	static TSharedPtr<FAssetUploaderMenu> Single = MakeShared<FAssetUploaderMenu>();
	return *Single;
}

void FAssetUploaderMenu::RegisterMenu()
{
	// 获取到UToolMenu
	if (UToolMenu* Menu = UToolMenus::Get()->ExtendMenu("ContentBrowser.AssetContextMenu"))
	{
		Menu->AddDynamicSection(FName(TEXT("DynamicSection_DataSource_AssetUploaderMenu")), FNewToolMenuDelegate::CreateLambda([this](UToolMenu* InMenu) {
			AddAssetUploaderMenu(InMenu);
		}));
	}
}

#undef LOCTEXT_NAMESPACE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值