准备工作
UObject* Asset
 
UObject* Asset 通常指的是一个指向UObject的指针。UObject是Unreal Engine中的基类,几乎所有的引擎对象都继承自UObject。这个指针可以引用任何派生自UObject的对象,比如蓝图、材质、贴图、音频资源等资产。
如果你看到UObject* Asset,它通常用于指向一个已加载或正在使用的引擎资产。你可以使用UObject*来动态加载资产。例如,使用StaticLoadObject()函数从文件路径加载一个资产。
UObject* Asset = StaticLoadObject(UObject::StaticClass(), nullptr, TEXT("/Game/MyAssetPath.MyAsset"));
Data Structure
| TArray<FString> PrefixArray | Slow in look up(查找缓慢) | 
| TMap<UClass*,FString> PrefixMap | Fast in look up | 
inside the map you will have two elements, one is the key, one is the value
and for the key, it is our UClass (material/texture/blueprint)
TMap<UClass*, FString> PrefixMap
类型映射(TMap),它将一个键值对映射起来。
-  UClass*是指向一个类对象的指针。UClass示类的元类对象,通过UClass*,可以引用 UE里的各种类类型, 如material,texture,blueprint。
-  FString是一个字符串类型,存储文本数据,对应地如"M_" "T_" "BP_"。
build-in function
PrefixMap.Find(SelectedObject->GetClass())
includes and TPairs
#include "Materials/Material.h"
 #include "Materials/MaterialInstanceConstant.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"    
        {UBlueprint::StaticClass(),TEXT("BP_")},
         {UStaticMesh::StaticClass(),TEXT("SM_")},
         {UMaterial::StaticClass(), TEXT("M_")},
         {UMaterialInstanceConstant::StaticClass(),TEXT("MI_")},
         {UMaterialFunctionInterface::StaticClass(), TEXT("MF_")},
         {USoundCue::StaticClass(), TEXT("SC_")},
         {USoundWave::StaticClass(), TEXT("SW_")},
         {UTexture::StaticClass(), TEXT("T_")},
         {UTexture2D::StaticClass(), TEXT("T_")},
         {UUserWidget::StaticClass(), TEXT("WBP_")},
         {USkeletalMeshComponent::StaticClass(), TEXT("SK_")},
         {UNiagaraSystem::StaticClass(), TEXT("NS_")},
         //{UNiagaraEmitter::StaticClass(), TEXT("NE_")}
示例代码
quickAssetAction.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "AssetActionUtility.h"
#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"    
#include "QuickAssetAction.generated.h"//should be the last one, otherwise will have error
/**
 * 
 */
UCLASS()
class SUPERMANAGER_API UQuickAssetAction : public UAssetActionUtility
{
	GENERATED_BODY()
public:
	//UFUNCTION(CallInEditor)
	//void TestFuckingFunc();
	UFUNCTION(CallInEditor)
	void BatchDuplication(int32 NumOfDuplicates);
	UFUNCTION(CallInEditor)
	void AddPrefixes();
private:
	TMap<UClass*, FString>PrefixMap =
	{
		{UBlueprint::StaticClass(),TEXT("BP_")},
		{UStaticMesh::StaticClass(),TEXT("SM_")},
		{UMaterial::StaticClass(), TEXT("M_")},
		{UMaterialInstanceConstant::StaticClass(),TEXT("MI_")},
		{UMaterialFunctionInterface::StaticClass(), TEXT("MF_")},
		//{UParticleSystem::StaticClass(), TEXT("PS_")},
		{USoundCue::StaticClass(), TEXT("SC_")},
		{USoundWave::StaticClass(), TEXT("SW_")},
		{UTexture::StaticClass(), TEXT("T_")},
		{UTexture2D::StaticClass(), TEXT("T_")},
		{UUserWidget::StaticClass(), TEXT("WBP_")},
		{USkeletalMeshComponent::StaticClass(), TEXT("SK_")},
		{UNiagaraSystem::StaticClass(), TEXT("NS_")},
		//{UNiagaraEmitter::StaticClass(), TEXT("NE_")}
	};
};
quickAssetAction.cpp
void UQuickAssetAction::AddPrefixes()
{
	TArray<UObject*>SelectedObjects = UEditorUtilityLibrary::GetSelectedAssets();
	uint32 Counter = 0;
	for (UObject* SelectedObject : SelectedObjects)
	{
		if (!SelectedObject) continue;//空指针检查  SelectedObject 是 nullptr
		FString* PrefixFound = PrefixMap.Find(SelectedObject->GetClass());
		//这一行查找 SelectedObject 对象对应的类(SelectedObject->GetClass())在 PrefixMap 中的值。
		// PrefixMap 是一个自己命名的TMap<UClass*, FString>键值对的映射,
		// 其中键是 UClass*(对象的类)如material,值是 FString(M_)。
		if (!PrefixFound || PrefixFound->IsEmpty())
		{
			Print(TEXT("Failed to find prefix for class ") + SelectedObject->GetClass()->GetName(), FColor::Red);
			continue;
		}
		FString OldName = SelectedObject->GetName();
		if (OldName.StartsWith(*PrefixFound))
		{
			Print(OldName + TEXT(" already has prefix added"), FColor::Red);
			continue;
		}
		const FString NewNameWithPrefix = *PrefixFound + OldName;
		UEditorUtilityLibrary::RenameAsset(SelectedObject, NewNameWithPrefix);
		++Counter;//将计数器 Counter 的值增加 1。它用于记录处理了多少个对象。
		//在脚本完成后,下面那串代码输出一条信息,例如 "成功处理了 X 个对象"。
	}
	if(Counter>0)
	{
		ShowNotifyInfo(TEXT("Successfully renamed " + FString::FromInt(Counter) + " assets"));
	}
}插件效果



优化补充:删除MI类型的默认前后缀
M_ xxxxx_Inst
示例代码
		//如果类型是MI_old name里有M_和_Inst,移除他们。
		if (SelectedObject->IsA<UMaterialInstanceConstant>())
		{
			OldName.RemoveFromStart(TEXT("M_"));
			OldName.RemoveFromEnd(TEXT("_Inst"));
		}


















