UE5.1编辑器拓展【二、脚本化资产行为,快速更改资产名字,1.直接添加前缀或后缀2.通过资产类判断添加修改前缀】

目录

了解相关的函数

第一种做法:自定义添加选择资产的前缀或后缀

代码

效果

第二种做法:通过映射来获取资产类型添加前缀和修改前缀

映射代码

代码

效果


在之前一章中,我们创建了插件,用来扩展编辑器的使用:

UE5.1编辑器拓展【一、脚本化资产行为,通知,弹窗,高效复制多个同样的资产】-CSDN博客

现在我们需要的是能够更快的对资产的名字进行一个更改,比如对前缀名的添加,或者是后缀的删除等等。

了解相关的函数

要更改资产的名字,首先我们要先了解几个相关的编辑器函数,以及FString的使用:

首先是RenameAsset ,这个函数是属于UEditorUtilityLibrary,使用的时候就是输入资产和新的名字。

然后是FString的使用,这里只需要+即可,比如你要加前缀Prefix,则Prefix+name即可,后缀也是一样。

当然这只是一种做法,除此之外,还有通过判断类型来直接添加名字。

第一种做法:自定义添加选择资产的前缀或后缀

如果是需要自定义选择前缀名,那么我们需要的是输入一个FString和一个bool。

通过bool来判断你是要添加前缀还是后缀。

首先遍历选择的资产,然后检查是否有效,然后判断是添加前缀还是后缀,最后进行添加。

然后右下角通知添加前缀成功。

代码

cpp 复制代码
void UQuicklyAssetAction::AddAssetPreOrEndfixes(FString Assetfixes, bool PrefixOrPostfix)
{
	TArray<UObject*> SelectedObjects = UEditorUtilityLibrary::GetSelectedAssets();
	uint32 Counter = 0;
	for (UObject* SelectedObject : SelectedObjects)
	{
		if (!SelectedObject)//检查是否有效
		{
			continue;
		}
		FString NewName;
		if (PrefixOrPostfix)//添加前缀
		{
			NewName = Assetfixes + SelectedObject->GetName();
		}
		else//添加后缀
		{
			NewName = SelectedObject->GetName()+ Assetfixes;
		}
		UEditorUtilityLibrary::RenameAsset(SelectedObject, NewName);
		Counter++;
	}
	if (Counter>0)
	{
		if (PrefixOrPostfix)
		{
			ShowNotifyInfo("Prefix add "+FString::FromInt(Counter)+" files",7);
		}
		else
		{
			ShowNotifyInfo("Postfix add " + FString::FromInt(Counter) + " files", 7);
		}
	}
}	

效果

可以看到里面有相关注释和行为:

然后点击:

第二种做法:通过映射来获取资产类型添加前缀和修改前缀

首先我们做一个映射,这个映射的作用就是判断你的资产是属于哪种类的存在:

映射代码

cpp 复制代码
TMap<UClass*, FString> PrefixMap =
	{
		{UBlueprint::StaticClass(),TEXT("BP_")},
		{UStaticMesh::StaticClass(),TEXT("SM_")},
		{UMaterial::StaticClass(),TEXT("M_")},
		{UMaterialInstanceConstant::StaticClass(),TEXT("MI_")},
		{UMaterialFunction::StaticClass(),TEXT("MF_")},
		{UParticleSystem::StaticClass(),TEXT("PS_")},
		{USoundCue::StaticClass(),TEXT("SC_")},
		{USoundWave::StaticClass(),TEXT("SW_")},
		{UTexture::StaticClass(),TEXT("T_")},
		{UTexture2D::StaticClass(),TEXT("T2D_")},
		{UUserWidget::StaticClass(),TEXT("UI_")},//用户控件无效,需要继续寻找
		{USkeletalMeshComponent::StaticClass(),TEXT("SK_")},
		{UNiagaraSystem::StaticClass(),TEXT("NS_")},
		{UNiagaraEmitter::StaticClass(),TEXT("NE_")}
	};

做好这个映射之后【有些可能有问题,需要自己去重新查找一下相关的类】

接下来和之前一样,去遍历我们选择的资产,然后寻找资产的类,来获取我们做的映射中的value值【前缀】。

然后在获取资产名字来判断这个资产是否已经有了和这个一样的前缀,有了就不加了。

然后继续做一个判断,假如你做了一个材质实例,那么其名字必然是M_XXX_Inst ,我们如果直接添加了名字,就会变成MI_M_XXX_Inst ,所以在添加之前,我们需要先判断一下,前缀是不是M_和后缀是不是_Inst

是的话,就进行删除,然后在重命名。

代码

cpp 复制代码
void UQuicklyAssetAction::WithClassAddAssetPrefixes()
{
	//将选择的资产放入数组
	TArray<UObject*> SelectedObjects = UEditorUtilityLibrary::GetSelectedAssets();
	uint32 Counter = 0;
	//遍历选择的资产
	for (UObject* SelectedObject : SelectedObjects)
	{
		//如果无效则跳入下一次迭代
		if (!SelectedObject)
		{
			continue;
		}
		//返回的是FString指针,通过选择资产的类作为key来找到PrefixMap映射中的value,如M_
		FString*  PrefixFound =PrefixMap.Find(SelectedObject->GetClass());
		//判断是否有效和存在
		if (!PrefixFound || PrefixFound->IsEmpty())
		{
			//无效则打印没有找到,然后输出这个类的类的名字
			DebugPrint(TEXT("Failed to find Prefix for class ") + SelectedObject->GetClass()->GetName(), FColor::Red);
			DebugPrintLog(TEXT("Failed to find Prefix for class ") + SelectedObject->GetClass()->GetName());
			continue;
		}
		//获取老资产的名字
		FString OldName = SelectedObject->GetName();
		//判断资产的名字是否以PrefixFound开头:如M_
		if (OldName.StartsWith(*PrefixFound))
		{
			DebugPrint(OldName + " already have the prefix!", FColor::Red);
			DebugPrintLog(OldName + " already have the prefix!");
			continue;
		}
		//这里做材质实例的检查
		if (SelectedObject->IsA<UMaterialInstanceConstant>())
		{
			//检查有没有,有就移除
			OldName.RemoveFromStart("M_");
			OldName.RemoveFromEnd("_Inst");
		}
		//做新的名字
		const FString NewNameWithPrefix = *PrefixFound + OldName;
		//重命名和计数
		UEditorUtilityLibrary::RenameAsset(SelectedObject, NewNameWithPrefix);
		Counter++;
	}
	if (Counter>0)
	{
		ShowNotifyInfo("Success rename Asset " + FString::FromInt(Counter) + "Assets", 7);
	}
}

添加头文件和模块

需要注意的是这种方法我们需要对相关类型的头文件进行添加,以及相关的模块。

模块添加:

头文件添加​​​​​​​

cpp 复制代码
#include "Materials/Material.h"
#include "Materials/MaterialInstanceConstant.h"
#include "Particles/ParticleSystem.h"
#include "Sound/SoundCue.h"
#include "Sound/SoundWave.h"
#include "Engine/Texture.h"
#include "Blueprint/UserWidget.h"
#include "Components/SkeletalMeshComponent.h"
#include "NiagaraSystem.h"
#include "NiagaraEmitter.h"

效果

相关推荐
蜀黍@猿20 分钟前
【C++ 基础】从C到C++有哪些变化
c++
ue星空20 分钟前
虚幻引擎结构之AActor
虚幻
Am心若依旧40921 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生23 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
zh路西法31 分钟前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
大G哥33 分钟前
java提高正则处理效率
java·开发语言
VBA633743 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~1 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳1 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎