今天接到个任务,需要在Editor的资源右键菜单上添加两个按钮,用来上传资源,一个是默认参数上传,一个是用户输入描述去上传,研究了半天,最后在UE的源码里找到的作业抄了下来,做个记录,由于周五了实在是太累了,不想详细写了,直接贴代码吧,后续有心情再改。效果如下
企业微信截图_16578864552915.png#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
网友评论